Tomcat在Google OAuth 2.0重定向后新建会话的原因咨询
Tomcat中OpenID Connect回调会话丢失的原因分析
核心原因围绕Tomcat会话依赖的JSESSIONID Cookie传递失效,具体拆解如下:
Cookie属性配置错误
SameSite属性:如果会话Cookie设为Strict,跨站跳转(从Google域名回到你的Tomcat站点)时,浏览器会拒绝携带Cookie,Tomcat只能创建新会话。建议把SameSite设为Lax,允许跨站GET请求携带Cookie。Secure属性:如果你的站点用HTTPS,但Cookie没开启Secure,浏览器会在HTTPS环境下不发送这个Cookie,直接导致会话丢失。Domain属性:如果Tomcat配置的Cookie域名和当前站点实际域名不匹配,跳转后浏览器不会把Cookie发给Tomcat。
Tomcat会话本身的配置问题
- 会话超时设置过短:如果用户从打开login.jsp到完成Google授权跳转回来的时间,超过了Tomcat的会话超时时间,原会话已经被销毁,回调请求会触发新会话创建。
- 集群部署的会话同步缺失:如果是多节点Tomcat集群,原会话存在A节点,但回调请求被路由到了未同步会话的B节点,B节点就会生成新会话。
请求路径不匹配
Tomcat的JSESSIONID Cookie默认绑定到应用的上下文路径(比如应用部署在/oauth下,Cookie路径就是/oauth)。如果login.jsp和redirect.jsp的路径不在同一个上下文下,或者回调请求的路径不在Cookie的路径范围内,浏览器不会携带JSESSIONID。浏览器隐私拦截
用户浏览器开启隐私模式、第三方Cookie拦截功能时,会阻止跨站请求携带会话Cookie,导致Tomcat无法识别原会话,只能创建新会话。
关于你考虑的文件存储替代方案的补充
用文件存储状态令牌时,除了验证创建时间和请求IP,还要注意:
- 给每个令牌生成唯一UUID作为标识,避免存储冲突
- 给令牌设置明确的过期时间,定期清理过期文件,避免存储冗余
- 保证文件读写的线程安全,比如加锁处理,防止并发读写出现异常
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

