Tomcat配置web.xml的HttpOnly、Secure标识后Firefox42会话过期问题
问题产生原因
主要由两个兼容性问题共同导致:
- Secure属性处理逻辑差异:Firefox v42及更早版本对带
Secure标记的Cookie处理规则和现代浏览器不同:如果站点运行在HTTP协议下,或Tomcat未正确识别反向代理的HTTPS上下文,旧版火狐会直接拒绝存储带Secure标记的会话Cookie,而非像现代浏览器一样仅限制Cookie的发送场景。 - SameSite属性不兼容:Tomcat 8.5及更高版本默认使用
Rfc6265CookieProcessor生成Cookie,会默认给会话Cookie添加SameSite=Lax属性。Firefox v42发布于2015年,早于SameSite属性的标准化时间,完全无法识别该属性,会直接丢弃带有未知属性的Cookie,导致后续请求没有JSESSIONID标识,服务端判定会话过期。
兼容解决方案
方案1:更换Cookie处理器(优先尝试,改动最小)
如果使用的是Tomcat 8.5及以上版本,直接替换默认的Cookie处理器为旧版实现,关闭SameSite属性的默认输出,即可解决90%以上的兼容问题:
- 编辑Tomcat的
conf/context.xml文件,在<Context>节点内添加以下配置:
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
- 重启Tomcat后验证即可,原有
web.xml中的http-only和secure配置无需修改。
方案2:配置Tomcat识别反向代理HTTPS上下文
如果站点通过反向代理做了HTTPS卸载(用户访问是HTTPS,代理转发到Tomcat是HTTP),需要在Tomcat的conf/server.xml的对应Connector节点添加配置,让Tomcat感知外层HTTPS协议,避免Firefox v42误判Cookie来源:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" scheme="https" secure="true" proxyPort="443" />
方案3:动态适配旧版浏览器的Cookie属性
如果站点同时存在HTTP和HTTPS访问场景,可自定义Cookie处理器,对Firefox v42及更早版本单独关闭Secure标记:
- 自定义Cookie处理器实现:
public class FirefoxCompatibleCookieProcessor extends LegacyCookieProcessor { @Override public String generateSessionCookie(Context context, String sessionId, boolean secure) { HttpServletRequest request = (HttpServletRequest) RequestContextHolder.getRequestAttributes() .resolveReference(RequestAttributes.REFERENCE_REQUEST); String userAgent = request.getHeader("User-Agent"); if (userAgent != null && userAgent.contains("Firefox/")) { try { int ffVersion = Integer.parseInt(userAgent.split("Firefox/")[1].split("\\.")[0]); if (ffVersion <= 42) { secure = false; } } catch (Exception ignored) {} } return super.generateSessionCookie(context, sessionId, secure); } }
- 在
context.xml中配置自定义处理器:
<Context> <CookieProcessor className="com.yourcompany.config.FirefoxCompatibleCookieProcessor" /> </Context>
方案4:临时降级关闭Secure标记(应急用)
如果没有HTTPS安全要求,可直接修改web.xml中的配置,将<secure>true</secure>改为<secure>false</secure>,即可快速兼容所有旧版浏览器,但会降低会话安全性,存在Cookie被劫持的风险。
内容的提问来源于stack exchange,提问作者arunken
相关产品推荐
相关产品推荐

