如何在Wildfly 15.0.1.Final中设置SameSite Cookie适配跨域IFrame?
Wildfly 15 没有像19+版本那样原生支持SameSite Cookie的配置项,需要通过自定义Servlet过滤器或Undertow全局阀两种方式实现,以下是具体操作步骤:
方法一:应用层Servlet过滤器(仅当前应用生效)
这种方式无需修改服务器配置,仅需在应用内添加过滤器代码即可:
- 编写自定义过滤器类,处理响应Cookie并添加SameSite属性
import javax.servlet.*; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class SameSiteCookieFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse resp = (HttpServletResponse) response; chain.doFilter(request, response); // 遍历所有已设置的Cookie,追加SameSite=None; Secure属性 Cookie[] cookies = resp.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { String updatedCookie = String.format("%s=%s; SameSite=None; Secure", cookie.getName(), cookie.getValue()); resp.addHeader("Set-Cookie", updatedCookie); } } } @Override public void destroy() {} }
- 在
web.xml中配置过滤器,使其对所有请求生效
<filter> <filter-name>SameSiteCookieFilter</filter-name> <filter-class>com.your.package.SameSiteCookieFilter</filter-class> </filter> <filter-mapping> <filter-name>SameSiteCookieFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
方法二:Undertow全局阀(服务器所有应用生效)
这种方式通过扩展Wildfly的Undertow容器,实现全局Cookie属性修改:
- 编写自定义Undertow Handler类
import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; import io.undertow.util.HeaderMap; import io.undertow.util.Headers; public class SameSiteCookieHandler implements HttpHandler { private final HttpHandler nextHandler; public SameSiteCookieHandler(HttpHandler next) { this.nextHandler = next; } @Override public void handleRequest(HttpServerExchange exchange) throws Exception { nextHandler.handleRequest(exchange); HeaderMap responseHeaders = exchange.getResponseHeaders(); // 遍历所有Set-Cookie头,添加SameSite属性 for (String cookieHeader : responseHeaders.get(Headers.SET_COOKIE)) { if (!cookieHeader.contains("SameSite")) { String updatedCookie = cookieHeader + "; SameSite=None; Secure"; responseHeaders.remove(Headers.SET_COOKIE, cookieHeader); responseHeaders.add(Headers.SET_COOKIE, updatedCookie); } } } }
- 打包为Jar并部署到Wildfly模块
- 将编译后的类打包为
same-site-handler.jar - 在Wildfly安装目录下创建
modules/system/layers/base/com/your/package/main目录,放入Jar包和以下module.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.3" name="com.your.package"> <resources> <resource-root path="same-site-handler.jar"/> </resources> <dependencies> <module name="io.undertow.core"/> <module name="javax.servlet.api"/> </dependencies> </module>
- 修改服务器配置文件(
standalone.xml或domain.xml)
- 在
<server name="default-server">下的<host name="default-host">节点内添加过滤器引用:
<filter-ref name="same-site-cookie-filter"/>
- 在
<filters>节点下添加过滤器配置:
<filter name="same-site-cookie-filter" module="com.your.package" class-name="com.your.package.SameSiteCookieHandler"/>
- 重启Wildfly服务器使配置生效
关键注意事项
- 必须使用HTTPS环境:Chrome/Edge要求SameSite=None必须配合Secure属性,只有HTTPS传输的Cookie才能生效,否则浏览器会忽略该设置。
- 若应用内有手动设置Cookie的代码,也可直接在代码中添加属性:
Cookie cookie = new Cookie("yourCookieName", "value"); cookie.setSecure(true); cookie.setAttribute("SameSite", "None"); response.addCookie(cookie);
内容的提问来源于stack exchange,提问作者user3078422
相关产品推荐
相关产品推荐

