前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Http Cookie的使用

Http Cookie的使用

原创
作者头像
翰墨飘香
发布2025-02-06 23:21:30
发布2025-02-06 23:21:30
460
举报
文章被收录于专栏:翰墨飘香

Cookie 操作

在Java中操作Cookie通常涉及到HttpServletRequest和HttpServletResponse对象。以下是一些常见的操作Cookie的方法:

获取request的Cookie

代码语言:java
复制
Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        String name = cookie.getName();
        String value = cookie.getValue();
        // 处理cookie
    }
}

response创建Cookie

代码语言:java
复制
Cookie cookie = new Cookie("cookieName", "cookieValue");
cookie.setMaxAge(3600); // 设置cookie有效期为1小时
response.addCookie(cookie);

获取response的cookie

http代理的情况下需要重新获取cookie

方式一、 Apache HttpClient采集cookie

代码语言:java
复制
        // 创建一个CookieStore
        CookieStore cookieStore = new BasicCookieStore();
        // 创建一个HttpClientContext对象,并将CookieStore设置进去
        HttpClientContext context = HttpClientContext.create();
        context.setCookieStore(cookieStore);

        HttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
        HttpPost httpPost = new HttpPost(this.getUseUrl());

        // 执行请求
        HttpResponse userHttpResponse  = httpClient.execute(httpPost, context);
        
        // 获取cookie
        List<Cookie> cookies = cookieStore.getCookies();
        for (Cookie cookie : cookies) {
            log.info("Cookie:{}", cookie.getName() + "=" + cookie.getValue());
            javax.servlet.http.Cookie c = new javax.servlet.http.Cookie(cookie.getName(), cookie.getValue());
            // 单位是秒
            Date date =  cookie.getExpiryDate();
            c.setMaxAge((int) ((System.currentTimeMillis()-date.getTime())/1000));
            c.setDomain(cookie.getDomain());
            c.setPath(cookie.getPath());
            response.addCookie(c);
        }

方式二、使用spring的ResponseEntity手动解析

代码语言:java
复制
        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(map, headers);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(this.getUseUrl(), httpEntity, String.class);

        List<String> cookieHeaders = responseEntity.getHeaders().get("Set-Cookie");

        List<Cookie> cookies = extractCookies(cookieHeaders);
        cookies.forEach(cookie -> response.addCookie(cookie));
代码语言:java
复制
public static List<Cookie> extractCookies(List<String> cookieHeaders) {
        List<Cookie> cookies = new ArrayList<>();

        if (CollectionUtils.isEmpty(cookieHeaders)) {
            return cookies;
        }

        for (String cookieHeader : cookieHeaders) {
            try {
                String[] parts = cookieHeader.split(";\\s*");
                String[] nameValue = parts[0].split("=", 2);
                Cookie cookie = new Cookie(nameValue[0], nameValue[1]);
                for (int i = 1; i < parts.length; i++) {
                    String[] attr = parts[i].split("=", 2);
                    switch (attr[0].trim().toLowerCase()) {
                        case "path":
                            cookie.setPath(attr[1]);
                            break;
                        case "Max-Age":
                            cookie.setMaxAge(Integer.parseInt(attr[1]));
                            break;
                        case "Domain":
                            cookie.setDomain(attr[1]);
                            break;
                    }
                }
            } catch (Exception e) {
                log.error("[orderLogin] convert cookie error cookie String:{}", cookieHeader, e);
            }
        }

        return cookies;
    }

方式三、返回头重新赋值

在不需要知道cookie细节,但需要将cookie代理返回的场景,可以直接重新赋值请求头

因为cookie存于请求头中

代码语言:java
复制
HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(map, headers);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(this.getUseUrl(), httpEntity, String.class);
responseEntity.getHeaders().forEach((name, values) -> values.forEach(value -> response.addHeader(name, value)));

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Cookie 操作
  • 获取request的Cookie
  • response创建Cookie
  • 获取response的cookie
    • 方式一、 Apache HttpClient采集cookie
    • 方式二、使用spring的ResponseEntity手动解析
    • 方式三、返回头重新赋值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档