在Java中操作Cookie通常涉及到HttpServletRequest和HttpServletResponse对象。以下是一些常见的操作Cookie的方法:
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
// 处理cookie
}
}
Cookie cookie = new Cookie("cookieName", "cookieValue");
cookie.setMaxAge(3600); // 设置cookie有效期为1小时
response.addCookie(cookie);
http代理的情况下需要重新获取cookie
// 创建一个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);
}
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));
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存于请求头中
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 删除。