为何Internet Explorer请求头不携带JSESSIONID Cookie?
解决IE下Tomcat会话失效的问题(OpenShift环境)
这确实是个让人头疼的IE专属兼容性问题,结合你提供的迁移背景、配置信息和排查细节,我整理了几个针对性的排查方向和解决方案:
1. 检查IE的Cookie安全设置
IE的隐私和安全设置经常是这类问题的根源,尤其是在OpenShift的域名环境下:
- 打开IE的Internet选项 → 隐私 → 高级,确认是否勾选了「覆盖自动Cookie处理」,确保第一方和第三方Cookie都设置为「接受」;
- 检查「保护模式」是否开启(Internet选项 → 安全),如果开启,尝试临时关闭测试——保护模式可能会限制Cookie在跨域/代理场景下的写入。
2. 修正Tomcat的CookieDomain配置
虽然你提到已经修改过domain属性,但可能配置的格式不对:
- 在
web.xml的<cookie-config>中添加完整的父域名(注意前缀的点):<cookie-config> <path>/</path> <domain>.appcloud-np.mycompany.com</domain> </cookie-config> - 或者在Tomcat的
context.xml中添加全局CookieDomain配置:
这样配置后,子域名<Context> <CookieDomain>.appcloud-np.mycompany.com</CookieDomain> </Context>app-external-dev-4823.appcloud-np.mycompany.com下的Cookie可以被正确识别。
3. 检查OpenShift路由的代理头传递
OpenShift的路由作为反向代理,可能没有正确传递主机头导致Tomcat生成的Cookie不匹配:
- 确认OpenShift路由是否配置了
ProxyPreserveHost On(如果使用Apache HTTPD作为路由代理),这个配置会将原始请求的Host头传递给后端Tomcat,确保Tomcat生成的Cookie域名与请求域名一致; - 检查路由是否修改了
Set-Cookie头,比如是否有额外的重写规则导致Cookie属性被篡改。
4. 针对Tomcat 7的SameSite Cookie处理(IE兼容)
你使用的是Tomcat 7,它本身不支持SameSite Cookie属性,但IE对未设置或错误设置该属性的Cookie可能有特殊处理:
- 添加一个自定义过滤器,手动为
JSESSIONIDCookie添加SameSite=Lax属性(IE会忽略该属性,但其他浏览器不受影响,同时避免潜在的兼容性问题):
然后在public class SameSiteFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse resp = (HttpServletResponse) response; chain.doFilter(request, response); Collection<String> cookies = resp.getHeaders("Set-Cookie"); boolean firstCookie = true; for (String cookie : cookies) { if (firstCookie) { resp.setHeader("Set-Cookie", cookie + "; SameSite=Lax"); firstCookie = false; } else { resp.addHeader("Set-Cookie", cookie + "; SameSite=Lax"); } } } // 实现init和destroy方法的空逻辑即可 @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void destroy() {} }web.xml中注册这个过滤器,使其作用于所有请求。
5. 验证IE是否实际保存了JSESSIONID Cookie
用IE的开发者工具(F12)做以下检查:
- 切换到「网络」选项卡,刷新页面,查看响应头中的
Set-Cookie是否正确返回; - 切换到「应用程序」选项卡,查看「Cookie」下是否存在
JSESSIONID,确认其domain、path属性是否与请求URL匹配。
另外,由于你的应用在本地Tomcat正常,问题大概率出在OpenShift的代理/路由配置,或者IE对云环境域名的安全限制上,建议优先排查前三个方向。
内容的提问来源于stack exchange,提问作者Bruno Moreira
相关产品推荐
相关产品推荐

