Spring Boot SSO接口在Chrome多次请求后意外返回302问题求助
问题场景
- 后端基于Java Spring Boot 2.4.13,原MVC架构,正迁移至Vue+REST架构
- 集成第三方LS的SSO流程:用户点击LS站点SSO按钮后,LS向我方
/ssoPOST接口发送带token的请求;我方将token存入会话,通过ModelAndView跳转至自动提交表单的JSP页面,完成用户在LS的登录 - 功能在Firefox中完全正常,但Chrome/Edge等Chromium内核浏览器中,首次操作正常,多次操作或等待数分钟后,LS触发的POST请求会被服务器返回302重定向至登录页(用户实际处于登录状态)
- 异常时请求未进入
/sso控制器,自定义Servlet过滤器也未捕获到该302响应;302的Location包含登录URL及errorKey=rs.home.loginRequired,追踪确认来自Web Security配置的LoginUrlAuthenticationEntryPointBean,推测服务器误判用户未登录
排查方向
1. 会话Cookie的SameSite属性限制
Chromium对跨域Cookie的SameSite属性限制远严格于Firefox:
- 检查我方会话Cookie(如JSESSIONID)的SameSite设置,若为
Strict或Lax,跨域POST请求(LS向我方/sso发起)可能无法携带Cookie,导致服务器认为用户未登录 - 尝试将SameSite设置为
None并开启Secure(需HTTPS环境),验证是否解决问题 - 对比Firefox和Chrome异常时请求携带的Cookie列表,确认是否缺失会话Cookie
2. Spring Security的CSRF拦截
Spring Security默认开启CSRF防护,跨域POST请求若未携带有效CSRF Token会被拦截,触发登录重定向:
- 临时在Web Security配置中为
/sso接口关闭CSRF防护(csrf().ignoringAntMatchers("/sso")),验证是否是CSRF导致的拦截 - 若确认是CSRF问题,需让LS在请求中携带我方生成的CSRF Token,或调整CSRF防护策略
3. 会话状态与浏览器缓存冲突
- 对比服务器会话超时时间与异常出现的等待时长,检查是否存在会话超时误判;同时查看响应头
Set-Cookie的超时配置是否正确 - 检查Spring Security的会话管理配置,如
sessionFixation()、maximumSessions()等是否会导致会话被意外销毁
4. Chromium的预加载机制
Chromium的预加载功能可能提前发送请求,导致会话状态异常:
- 查看Chrome网络请求记录的
Purpose字段,确认异常请求是否为预加载请求 - 在
/sso接口响应中添加X-Robots-Tag: noindex, nofollow或Cache-Control: no-cache, no-store, must-revalidate, proxy-revalidate头,禁止浏览器预加载该接口
5. Spring Security的路径权限配置
- 确认
/sso接口是否在Spring Security的permitAll()配置中,若未配置,会被认证拦截触发302重定向 - 检查Web Security中过滤器的执行顺序,是否有自定义过滤器在认证过滤器之前执行,导致会话状态未被正确识别
6. Cookie路径(Path)配置
- 检查会话Cookie的Path属性,若路径范围过小(如限定为子路径),跨域请求可能无法携带正确的Cookie,需确保Path设置为项目根路径
/
内容的提问来源于stack exchange,提问作者Mimerr
相关产品推荐
相关产品推荐

