cookie设置失败
有个小项目,本地测试一帆风顺,昨天发布到云服务器后就出问题了
Java端设置的Cookie,浏览器访问不到
1-2022-2-11
设置cookie代码如下
/** * 添加Cookie * @param hsp * @param n cookie key * @param v cookie value * @param p 设置区间 * @param noJs true:禁止js读取 false:默认 * @param secure * @param sameSite * 1:Strict 完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。 * 2:Lax 不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外 * 3:None 将Lax变为默认设置,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送) * @param t 有效时长(单位:s) */ public static void setCookieV(HttpServletResponse hsp, String n, String v, String p, boolean noJs, boolean secure, int sameSite, int t) { ResponseCookie c = ResponseCookie.from(n, v) .httpOnly(noJs) .secure(secure) // .domain("") // 域名 .path(p) .maxAge(t) .sameSite(sameSite == 1 ? "Strict" : (sameSite == 2 ? "Lax" : "None")) .build(); hsp.setHeader(HttpHeaders.SET_COOKIE, c.toString()); }
入参:
Utils.setCookieV(hsp, "ID", random, "/", true, true, 3, 3 * 60 * 60);
开始一直以为是返回流的问题,或者跨域的问题,但项目所有的cookie都没有涉及到第三方,按理来说不存在跨域问题
经过坚持不懈的翻资料,终于在一篇博客找到了问题所在
果然是个常识问题,我以为 secure 为 true 时是在http下也传输,把 secure 的值设置成了true
secure:true-仅在https下传输 / false:在http下也传输
最终入参 secure 值改为 false,成功
基础还需巩固,特此记录
参考文章:HostOnly Cookie和HttpOnly Cookie - 游子日月长 - 博客园 (cnblogs.com)
2-补充(2022-2-15)
上述方法在ie和Firefox下可行,Chorme80及以上版本无效
参考链接:(23条消息) 关于 chrome 80 后出现的 SameSite 问题_baidu_33569474的博客-CSDN博客
3-补充:问题解决(2022-2-16)
在大佬的指点下,我发现上述方法舍近求远了,直接用Response自带的addCookie方法就行,设置表头应该是兼容性有问题
/** * 添加Cookie * @param hsp * @param name * @param value * @param maxAge * @param secure */ public static void setCookie(HttpServletResponse hsp, String name, String value, String path, int maxAge, boolean secure) { Cookie c = new Cookie(name, value); c.setPath(path); c.setSecure(secure); c.setMaxAge(maxAge); hsp.addCookie(c); }