JavaWeb 同时给 cookie 设置过期时间Expires 和 Samesite 属性
有一个需求,同时给 cookie 设置过期时间Expires 和 Samesite 属性。Expires 为一个具体的时间,Samesite=none
失败过好多次,最后发现规律是:
httpResponse.addHeader("Set-Cookie",cksb.toString());
Samesite 有效,Expires 无效,永远是 session。
httpResponse.addCookie(cookie2);
Expires 有效,Samesite 无效,永远是默认。
最终解决方案是:
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseCookie;
ResponseCookie cookie;
if (TGC_COOKIE_SECURE) {
cookie = ResponseCookie.from(cookieName, cookieValue) // key & value
.httpOnly(true) // 禁止js读取
.secure(true) // 只在https传输
.path("/")// path
.maxAge(age) // 过期
.sameSite("None")// 大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外
.build();// 设置Cookie
} else {
cookie = ResponseCookie.from(cookieName, cookieValue) // key & value
.httpOnly(true) // 禁止js读取
.secure(false) // 在http下也传输
.path("/")// path
.maxAge(age) // 过期
.build();// 设置Cookie
}
// 注意是 addHeader,不是setHeader,不然就只有一个cookie了
response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());
//下面是合并成一行的写法
ResponseCookie cookie;
if (TGC_COOKIE_SECURE) {
cookie = ResponseCookie.from(cookieName, cookieValue).httpOnly(true).secure(true).path("/").maxAge(age).sameSite("None").build();
} else {
cookie = ResponseCookie.from(cookieName, cookieValue).httpOnly(true).secure(false).path("/").maxAge(age).build();
}
response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());
//也可以设置domain 属性
原创文章,欢迎转载,转载请注明出处!
把每一件简单的事情做好,就是不简单;把每一件平凡的事情做好,就是不平凡!相信自己,创造奇迹~~