欢迎访问我的个人网站==》 jiashubing.cn

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 属性

 

原创文章,欢迎转载,转载请注明出处!

 

posted @ 2022-07-01 11:11  贾树丙  阅读(1762)  评论(0编辑  收藏  举报