如何设置 SameSite 属性?
Posted
技术标签:
【中文标题】如何设置 SameSite 属性?【英文标题】:How to set SameSite attribute? 【发布时间】:2018-11-13 02:28:29 【问题描述】:我在 Cookie 中设置 SameSite 属性时遇到问题。我想设置这个属性,但是javax.servlet.http.Cookie
和java.net.HttpCookie
都没有提供处理它的方法。因此,我有一个想法来创建一个响应javax.servlet.Filter
来捕获“Set-Cookie”标头并添加“SameSite=Strict”属性。
response.setHeader("Set-Cookie", response.getHeader("Set-Cookie") + "; SameSite=strict");
它工作正常,但是当我在一个响应中有多个“Set-Cookie”标头时会出现问题。 javax.servlet.http.HttpServletResponse
不提供删除或覆盖多个同名 heder 的方法(迭代它们并使用 setHeader()
不起作用,因为它总是设置最后一个)。您知道如何将 SameSite 属性设置为 cookie 或如何覆盖响应过滤器中的标头吗?
提前致谢。
【问题讨论】:
请看我对此案的详细回答HERE。 检查这个使用 GenericFilterBean / 临时重定向请求来解决同类问题***.com/questions/63939078/… 【参考方案1】:事实证明,使用setHeader()
方法删除所有以前的同名标头,所以我只是在doFilter()
方法中创建简单的for 循环。它将SameSite=Strict
属性添加到每个设置的cookie。
boolean firstHeader = true;
for (String header : cookiesHeaders)
if (firstHeader)
httpResponse.setHeader("Set-Cookie",
String.format("%s; %s", header, "SameSite=Strict"));
firstHeader = false;
continue;
httpResponse.addHeader("Set-Cookie",
String.format("%s; %s", header, "SameSite=Strict"));
【讨论】:
它对我不起作用,我使用的是 jetty 6.1 和 servlet API 2.5,这可能是原因吗? SameSite=Strict 属性在控制台上可见,但在浏览器上不可见。【参考方案2】:在 etc/apache2/httpd.conf 中
标题编辑 Set-Cookie ^(.*)$ $1;SameSite=Strict
为我工作.....
【讨论】:
【参考方案3】:新 Tomcat 通过TomcatContextCustomizer
支持 SameSite cookie。
@Configuration
中完成,请参阅 https://***.com/a/60860531/548473
对于 Tomcat 应用程序 - 在 context.xml
中,请参阅 https://***.com/a/57622508/548473
【讨论】:
以上是关于如何设置 SameSite 属性?的主要内容,如果未能解决你的问题,请参考以下文章
<URL> 处的跨站点资源设置为没有 `SameSite` 属性 .NET
Springboot应用中设置Cookie的SameSite属性
使用 SameSite 和 Secure 属性设置 Google Tag Manager cookie
设置了没有“SameSite”属性的 cookie。 ......但我做到了