You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring 6迁移问题:会话属性存储失效与会话销毁异常

Spring 6/Spring Boot 3 迁移中Spring Session JDBC的问题

我们在迁移至Spring 6与Spring Boot 3时遇到两个核心问题:

  • 会话属性无法正常存储到数据库
  • 登出操作无法正确销毁会话

原Spring 5中的正常行为

在Spring 5环境下,我们配置了JDBC持久化会话(session.store-type: jdbc):

  • 登录成功后通过getSession(true)创建会话并存储用户名属性,数据库中spring_session表会生成对应记录,spring_session_attributes表中能看到存储的用户名属性和SPRING_SECURITY_CONTEXT属性
  • 请求返回会话Cookie,后续浏览器请求会携带该Cookie
  • 调用invalidate销毁会话时,数据库中相关记录会被移除,响应返回空Cookie清除浏览器端的会话标识,整个流程完全正常

Spring 6中的异常表现

配置http.securityContext { ctx -> ctx.requireExplicitSave(false) }时

  • 会话会存储到数据库,但spring_session_attributes表中仅能看到SPRING_SECURITY_CONTEXT属性,我们自定义存储的用户名属性缺失
  • 调用invalidate销毁会话时,数据库中的会话记录未被移除,浏览器端Cookie也未被清除,会话仍处于有效状态

配置http.securityContext { ctx -> ctx.requireExplicitSave(true) }时

  • 所有会话属性(包括自定义的用户名)都能正常存储到数据库,登出时持久化会话也会被正确移除
  • 但存在并发请求时,会出现数据库唯一键冲突错误,请求返回HTTP 500状态码:
ERROR: duplicate key value violates unique constraint "pk_spring_session_attributes"
  Detail: Key (session_primary_id, attribute_name)=(bc7114b1-3149-4c7b-8c23-b1023f51a8b9, SPRING_SECURITY_CONTEXT) already exists.

已尝试的排查动作

我们查阅了Spring Security官方的会话管理迁移文档,但文档内容并不适用——我们未修改安全上下文,仅通过其设置authentication属性。尝试手动保存上下文也未能解决问题,尤其是并发场景下的重复键冲突问题。

请问我们忽略了哪些关键配置或变更?Spring Session JDBC在Spring 6中是否还有其他未被注意到的行为变化?


内容的提问来源于stack exchange,提问作者gema

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:01:32