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); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?