我看到有些人在响应对象中使用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");
但我对这两种方法有点困惑,这两种方法有什么区别呢? 我们应该优先使用哪种方法。
就目前而言,由于Servlet api 4.0与SameSite属性不兼容,我会选择setHeaderaddHeader的解决方案。
更多的是,所有的请求cookie(如果没有设置sameSite=StrictLaxNone; 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,我无法在response头中看到相应的Set-Cookie......