servlet 中通过filter 如何为cookie中所有值都增加 SameSite属性
可以通过编写一个实现了 javax.servlet.Filter 接口的 filter 来实现该功能。具体实现过程如下:
-
在 filter 的 init 方法中读取 web.xml 或者注解配置中的需要增加 SameSite 属性的 cookie 名称,保存在一个集合中。
-
在 filter 的 doFilter 方法中,对每个响应进行拦截,获取响应中的所有 cookie,遍历所有 cookie,如果该 cookie 名称在上面保存的集合中,则为该 cookie 增加 SameSite 属性。
-
增加 SameSite 属性的方式为,在 HttpServletResponse 对象中调用 addHeader 方法,添加一个名为 Set-Cookie 的响应头,值为原 cookie 的值加上 SameSite 属性,例如:
response.addHeader("Set-Cookie", cookie.getName() + "=" + cookie.getValue() + "; SameSite=Lax");
- 在 filter 的 destroy 方法中清空集合并释放资源。
以下是一个示例 filter 的代码:
public class SameSiteCookieFilter implements Filter {
private Set<String> cookieNames;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String cookieNamesString = filterConfig.getInitParameter("cookieNames");
if (cookieNamesString != null) {
cookieNames = new HashSet<>(Arrays.asList(cookieNamesString.split(",")));
} else {
cookieNames = Collections.emptySet();
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
if (response instanceof HttpServletResponse) {
HttpServletResponse httpResponse = (HttpServletResponse) response;
for (Cookie cookie : httpResponse.getCookies()) {
if (cookie != null && cookieNames.contains(cookie.getName())) {
httpResponse.addHeader("Set-Cookie", cookie.getName() + "=" + cookie.getValue() + "; SameSite=Lax");
}
}
}
}
@Override
public void destroy() {
cookieNames.clear();
}
}
在 web.xml 中配置该 filter:
<filter>
<filter-name>SameSiteCookieFilter</filter-name>
<filter-class>com.example.filter.SameSiteCookieFilter</filter-class>
<init-param>
<param-name>cookieNames</param-name>
<param-value>sessionId,rememberMe</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SameSiteCookieFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
``
原文地址: https://www.cveoy.top/t/topic/hgiI 著作权归作者所有。请勿转载和采集!