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
相关产品推荐
相关产品推荐

