首页 > 解决方案 > 在响应中的 addCookie 和标头中的“Set-Cookie”之间感到困惑

问题描述

我看到有些人在响应对象中使用 addCookie 来设置 cookie,如下所示

Cookie cookie = new Cookie("name", value);
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
response.addCookie(cookie);

有些人在标题中使用“Set-Cookie”来添加cookie,如下所示

response.addHeader("Set-Cookie","name=" + value + ";Path=/; Secure; HttpOnly");

但是我对这两者都有点困惑,两者有什么区别?我们应该更喜欢使用哪一个。

标签: servletscookieshttp-headers

解决方案


截至今天,由于 Servlet api 4.0 与 SameSite 属性不兼容,我将转向 setHeader/addHeader 解决方案。

此外,所有请求 cookie(如果未设置为 sameSite=Strict/Lax/None; Secure)应通过 addHeader('Set-Cookie',...) 在响应中添加(以避免很快被几乎所有浏览器拒绝) , 如下

    boolean firstHeader = true;
    String sameSite = RequestUtil.isSecure(request) ? "; SameSite=None; Secure" : "; SameSite=Lax";
    for (String header : headers) { // there can be multiple Set-Cookie attributes
        if (firstHeader) {
            response.setHeader("Set-Cookie", String.format("%s; %s", header, sameSite));
            firstHeader = false;
            continue;
        }
        response.addHeader("Set-Cookie", String.format("%s; %s", header, sameSite));
    }

如果 response.getHeaders("Set-Cookie") 没有列出所有预期的 cookie,请尝试检查 request.getCookies,并使用它们在响应中添加 Set-Cookie Header。

注意:根据我的理解,response.addCookie 的行为与 response.addHeader("Set-Cookie") 的行为不同确实,使用 addCookie,我无法在响应标头中看到相应的 Set-Cookie...


推荐阅读