「すでに設定されているサーブレット応答のヘッダーを変更する方法」を検索するたびに、この投稿が最初に表示されます。質問の説明が異なっていても、(おそらく他の多くのように)サーブレット応答のヘッダーを変更する方法を知りたいです。すでに設定されています。この点で、私は(質問/回答を書く代わりに)探している人のために私の答えを投稿したいと思います。
public class SameSiteCookieHeaderFilter implements Filter {
private static final String LOCALE_ID_COOKIE = "locale";
private static final String SET_COOKIE_HEADER = "Set-Cookie";
@Override
public void destroy() {
}
@Override
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,
final FilterChain filterChain) throws IOException, ServletException {
final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
final HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
final Collection<String> setCookieHeaders = httpServletResponse.getHeaders(SET_COOKIE_HEADER);
for (final String setCookieHeader : setCookieHeaders) {
httpServletResponse.addHeader(SET_COOKIE_HEADER, setCookieHeader + "; Secure; SameSite=None");
}
if (setCookieHeaders.size() == 0) {
final Cookie[] cookies = httpServletRequest.getCookies();
for (final Cookie cookie : cookies) {
if (cookie.getName().equals(LOCALE_ID_COOKIE)) {
httpServletResponse.addHeader(SET_COOKIE_HEADER, buildSessionIdCookie(cookie.getValue()));
}
}
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
private String buildSessionIdCookie(final String value) {
return LOCALE_ID_COOKIE + "=" + value + "; " + "Path=/; " + "SameSite=None; " + "Secure; HttpOnly;";
}
web.xml
<filter>
<filter-name>SameSiteCookieHeaderFilter</filter-name>
<filter-class>de.chemmedia.kw.core.filter.SameSiteCookieHeaderFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SameSiteCookieHeaderFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
つまり、ヘッダーを検出してプロパティSet-Cookie
を追加SameSite=None
するか、Cookieを取得してすべての応答で構成Set-Cookie
します。SameSite=None
このようにSet-Cookie
して、同じ値を持つ2つのヘッダーがあり、2番目のヘッダーは前のヘッダーを上書きするか、**応答にすでに存在するヘッダーを変更します**。
Set-Cookie: locale=EN; Path=/; HttpOnly;
Set-Cookie: locale=EN; Path=/; SameSite=None; Secure; HttpOnly;
参考:Tomcat 7.0.104、サーブレット3.1およびSpring 4.2.x