为何Jetty访问未配置session-config/cookie-config的路径时仍发送Set-Cookie头?
问题原因及解决办法
原因分析
你遇到的问题核心在于:你的Web应用是部署在根上下文(/)下的,而web.xml中的<session-config>配置是全局作用于整个Web应用的Session Cookie的。
Jetty的Session管理逻辑中,只要当前请求触发了Session创建(比如调用request.getSession()),就会使用你配置的JSESSIONID-A及Path=/pathA参数发送Cookie——不管请求的路径是/pathA还是根路径/。因为整个根上下文的应用共享同一个Session池,Jetty不会根据请求路径动态切换Session的Cookie配置。
解决办法
1. 拆分Web应用(推荐)
将需要/pathA路径的功能单独部署为一个Web应用,设置其上下文路径为/pathA。这样:
- 该应用的
web.xml中配置的JSESSIONID-ACookie只会在访问/pathA路径时生效 - 根路径
/的应用(如果存在)可以使用默认的Session Cookie配置,两者互不干扰
2. 自定义Filter拦截Cookie发送
通过编写Servlet Filter,根据请求路径动态控制是否发送JSESSIONID-A Cookie:
编写Filter代码
public class SessionCookieFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse wrappedRes = new HttpServletResponseWrapper((HttpServletResponse) response) { @Override public void addCookie(Cookie cookie) { // 仅当请求路径以/pathA开头时,才添加JSESSIONID-A Cookie if ("JSESSIONID-A".equals(cookie.getName()) && req.getServletPath().startsWith("/pathA")) { super.addCookie(cookie); } } @Override public void setHeader(String name, String value) { handleSetCookieHeader(name, value, req); } @Override public void addHeader(String name, String value) { handleSetCookieHeader(name, value, req); } private void handleSetCookieHeader(String name, String value, HttpServletRequest req) { if ("Set-Cookie".equals(name)) { if (value.startsWith("JSESSIONID-A=") && req.getServletPath().startsWith("/pathA")) { super.addHeader(name, value); } } else { super.addHeader(name, value); } } }; chain.doFilter(req, wrappedRes); } @Override public void init(FilterConfig filterConfig) {} @Override public void destroy() {} }
在web.xml中配置Filter
<filter> <filter-name>SessionCookieFilter</filter-name> <filter-class>com.your.package.SessionCookieFilter</filter-class> </filter> <filter-mapping> <filter-name>SessionCookieFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3. 通过Jetty配置文件分离上下文
如果使用Jetty的XML配置文件(如jetty.xml),可以直接为不同上下文配置独立的Session Cookie参数:
<Set name="handler"> <New class="org.eclipse.jetty.server.handler.HandlerCollection"> <Set name="handlers"> <Array type="org.eclipse.jetty.server.Handler"> <!-- 根路径应用 --> <Item> <New class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/</Set> <Set name="war">/path/to/root-app.war</Set> <!-- 使用默认Session Cookie配置 --> </New> </Item> <!-- /pathA路径应用 --> <Item> <New class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/pathA</Set> <Set name="war">/path/to/pathA-app.war</Set> <!-- 配置自定义Session Cookie --> <Call name="getSessionHandler"> <Call name="getSessionManager"> <Set name="sessionCookie">JSESSIONID-A</Set> <Set name="sessionCookiePath">/pathA</Set> </Call> </Call> </New> </Item> </Array> </Set> </New> </Set>
内容的提问来源于stack exchange,提问作者Chin
相关产品推荐
相关产品推荐

