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都没有涉及到第三方,按理来说不存在跨域问题

经过坚持不懈的翻资料,终于在一篇博客找到了问题所在

果然是个常识问题,我以为 securetrue 时是在http下也传输,把 secure 的值设置成了true

securetrue-仅在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);
}    

 

posted @ 2022-02-11 10:23  散人长情  阅读(427)  评论(0编辑  收藏  举报