升Boot4后Session旧前缀失效:改spring.session.data.redis.*。按Migration Guide讲清改名、starter、连接边界与验收。
Boot4 升后 spring.session.redis 为什么不生效?
Spring Boot 4.0 Migration Guide「Spring Session」写得很直:
The properties for Spring Session Data Redis have been renamed to reflect the dependencies on Spring Data Redis. Properties that previously began with
spring.session.redisnow begin withspring.session.data.redis.
也就是说:不是 Spring Session 被移除 ,而是 Redis Session 的配置前缀对齐了 Spring Data Redis------旧的 spring.session.redis.* 在 Boot 4 里已换到 spring.session.data.redis.*。Configuration Changelog 的 Removed 表也一一指向这批新键。
常见现象对照:
| 现象 | 大致原因 |
|---|---|
升 4.0 后旧 spring.session.redis.* 像没生效 |
前缀已改名,旧键不再绑定 |
| Redis 里看不到预期 session key / namespace 不对 | 仍按旧前缀配,或 namespace 未随新键生效 |
| 登录态丢了 / 多实例会话不同步 | Session 存储选项没绑上,实际可能仍走默认 servlet 会话 |
| 「明明配了 spring.data.redis.host」仍不写 Session | 连接项与 Session 项是两套命名空间,见下文边界 |
同系列 Boot4 踩坑里,mongodb 属性改名见 168626140,Batch 默认内存改回库见 168731445,HttpServiceClient 换法见 168514849,Undertow 迁移见 168409414。本稿只盯 Session Redis 配置前缀怎么改,不把那些主题再写一遍。
先过一张决策图:

图:升 Boot4 后迁前缀→确认 starter→评估 @Enable 退避→核对连接与 timeout→验收;migrator 用完移除。*
要改成哪一串前缀?
批量规则只有一条:
| 旧前缀(Boot 3) | 新前缀(Boot 4) |
|---|---|
spring.session.redis.* |
spring.session.data.redis.* |
绑定类是 org.springframework.boot.session.data.redis.autoconfigure.SessionDataRedisProperties,注解为 @ConfigurationProperties("spring.session.data.redis")。也就是说,YAML/Properties 里凡是以前挂在 spring.session.redis 下的项,都应落到这个新前缀上。
示例:改名前后对照
yaml
# Boot 3(勿再沿用)
# spring:
# session:
# redis:
# namespace: spring:session
# flush-mode: on-save
# Boot 4
spring:
session:
timeout: 30m
data:
redis:
namespace: spring:session
flush-mode: on-save
save-mode: on-set-attribute
repository-type: default
configure-action: notify-keyspace-events
cleanup-cron: "0 * * * * *"
常见项默认值(Changelog / appendix)
按 Configuration Changelog 与 application-properties 附录,spring.session.data.redis.* 常见默认如下:
| 属性 | 默认值 |
|---|---|
cleanup-cron |
0 * * * * * |
configure-action |
notify-keyspace-events |
flush-mode |
on-save |
namespace |
spring:session |
repository-type |
default |
save-mode |
on-set-attribute |
升级时不必把六项全抄一遍;至少 把你项目里实际覆写过的旧键改到新前缀。未覆写的会走上表默认------其中 namespace=spring:session 直接影响 Redis 里 key 的前缀,验收时要盯它。
超时仍用 spring.session.timeout (未设时 servlet 场景可回落 server.servlet.session.timeout),这一项没有 改成 spring.session.data.redis.timeout。
starter 名字有没有变?
有,而且要和属性前缀一起核对。参考文档 Spring Session 与 Migration Guide Starters 表:
| 能力 | 主依赖 | 测试 companion |
|---|---|---|
| Spring Session Data Redis | spring-boot-starter-session-data-redis |
spring-boot-starter-session-data-redis-test |
Servlet 侧拉上 Redis Session starter 后,Boot 可自动配置 Session,取代 手写 @Enable*HttpSession 的需要;Reactive 侧依赖同一 Redis starter,取代 @EnableRedisWebSession。
Maven
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-session-data-redis</artifactId>
</dependency>
<!-- 另保留你的 Redis 连接依赖,例如 spring-boot-starter-data-redis -->
Gradle
kotlin
dependencies {
implementation("org.springframework.boot:spring-boot-starter-session-data-redis")
// implementation("org.springframework.boot:spring-boot-starter-data-redis")
}
只改 YAML、不换 starter,或 starter 对了但属性仍停在旧前缀------两种半吊子状态都常见,升级清单里建议 依赖与配置同 MR 改完。
spring.data.redis 连接配置要不要一起改?
不要。 这是本稿最容易写错、也最值得单独强调的边界:
| 命名空间 | 职责 | Boot 4 是否因 Session 而改名 |
|---|---|---|
spring.data.redis.*(如 host / port / password / url) |
Redis 连接 / 客户端 | 未改名 |
spring.session.data.redis.* |
Session 存储选项(namespace、flush-mode 等) | 由 spring.session.redis.* 改名而来 |
spring.session.timeout |
Session 超时 | 仍有效,勿挪进 data.redis 下 |
Migration Guide 只宣布 Session 属性前缀 rename,没有 声称连接前缀跟着改。把 spring.data.redis.host 误改成别的「看起来更对称」的名字,属于自造坑。
yaml
spring:
data:
redis:
host: redis.example.com
port: 6379
password: ${REDIS_PASSWORD}
session:
timeout: 30m
data:
redis:
namespace: spring:session
flush-mode: on-save
属性归属可以再压成一张图:

图:连接层 spring.data.redis 未改名;Session 存储改 data.redis;timeout 仍有效。
可选:properties-migrator 看一眼再删
Migration Guide「Configuration Properties Migration」建议:升级过程中可加运行时依赖 spring-boot-properties-migrator,启动时给出旧键诊断,并做临时运行时迁移。官方明确要求:
Once you're done with the migration, please make sure to remove this module from your project's dependencies.
实操建议:加 migrator → 看日志里旧 spring.session.redis.* 提示 → 改 YAML → 立刻从依赖里删掉 migrator。不要把 migrator 留在生产 BOM 里当长期兼容层。
手写 @Enable* 会怎样?
参考文档说明:若你手写 @Enable*HttpSession(servlet)或 @EnableRedisWebSession(reactive),Boot 的 Session 自动配置会 back off;或者你直接依赖 Session 模块而非 Boot starter,改用注解属性配置。
排障顺序建议:
- 全局搜
@EnableRedisHttpSession/@EnableRedisWebSession/ 其它@Enable*HttpSession - 能删则删,交给
spring-boot-starter-session-data-redis自动配置 - 必须保留时,确认注解属性与
spring.session.data.redis.*不打架,并接受「自动配置已退避」这一前提
这和 Batch 侧手写 @EnableBatchProcessing 导致 schema 初始化失效是同一类心智:注解一上手,Boot 的「开箱」路径就让位了。
相邻边界(一句带过,勿抢主线)
- Hazelcast Session :
spring.session.hazelcast.*在 Boot 4 是 移除(无替换),不是改名;直持已交 Hazelcast 团队。本稿不展开迁移。 - Mongo Session :Migration Guide 写旧
spring.session.mongodb.*→spring.session.data.mongodb.*;同时 Features Removed 称 Spring Session MongoDB 直持已移出 Boot。属性改名心智可对照 168626140 那类「前缀对齐」文,但 Mongo Session 产品路径另文,勿与本稿 Redis 主线混写。
怎么验证 Session 已经写进 Redis?
验收不要只看「应用能启动」:
- 启动日志:改名前后对比;若开过 migrator,确认旧键告警消失后再卸依赖。
- Redis key / namespace :默认
namespace为spring:session,用KEYS/SCAN(或你们平台的只读控制台)看是否出现对应前缀;若你覆写了 namespace,以配置值为准。 - 登录态:单实例登录 → 刷新仍保持;有条件时再做一次多实例/滚动发布,确认会话仍命中同一 Redis,而不是退回容器内存会话。
- 超时 :调短
spring.session.timeout做一次过期观察,确认走的是 Session 语义而非误改连接超时。
和 mongodb 属性改名、Batch 换 jdbc starter 一样,Session Redis 前缀适合单独开一个小 MR:只动 starter + spring.session.data.redis.*,不要和 Undertow / HttpService 大迁移揉在同一提交里。
边界与不要踩的坑
- 不要写「Spring Session 被移除」。Boot 4 仍提供 Session 自动配置与 Redis/JDBC starter;变的是前缀与模块化 starter。
- 不要改
spring.data.redis.*连接项的名字------那不是本次 rename 范围。 - Hazelcast 是移除、Redis 是改名,两套话术不要混。
- 手写
@Enable*会导致自动配置 back off;排障先搜注解。 - migrator 用完必须移除。
- 禁写 WebClient.Builder 上的
responseTimeout/connectTimeout迁移教条。 - 勿抢主线:mongodb 属性、Batch-jdbc、HttpService、Undertow 各有专文(见内链)。
- 真相源:Migration Guide · Spring Session、Configuration Changelog、Reference · Spring Session、SessionDataRedisProperties。
改名落地时的几条实操习惯
升级窗口里,建议把「搜旧前缀」当成和「搜 @Enable」同级的门禁:
- 全仓库搜
spring.session.redis(含application*.yml/application*.properties/ 配置中心导出快照 / Helm values)。 - 同步搜依赖坐标,确认已是
spring-boot-starter-session-data-redis,而不是只改了 YAML、starter 仍停留在旧心智。 - 配置中心若按 profile 分层(dev/stage/prod),每一层都要改到,避免「本地通了、预发仍旧键」。
- 改完先在非生产用一次短超时,并给
namespace加临时环境后缀,确认 key 落点后再改回约定值。
若团队还在用 spring-boot-properties-migrator 做大范围升版,可以把 Session 前缀当作 migrator 日志里的「样板告警」:先修这一簇,再扫其它 rename,节奏更稳。修完务必从依赖里删掉 migrator------它只是迁移期诊断工具,不是长期兼容层。
关于「会话不进 Redis」的排障顺序,实务上更稳妥的是:
- 先看有没有绑上新前缀(配置绑定最常见);
- 再看 starter 是否为
spring-boot-starter-session-data-redis; - 再看是否被
@Enable*HttpSession/@EnableRedisWebSession打退自动配置; - 最后才怀疑序列化、网关粘滞会话、过滤器顺序之类更深的问题。
前三步都是 Boot4 升版文档级变化;把顺序弄反,容易在 Redis 序列化器上耗一整天,最后发现只是 YAML 前缀没改完。
若你们用的是 reactive Web 栈,记住:Redis Session 仍然走同一只 spring-boot-starter-session-data-redis。启用注解从 servlet 侧换成 @EnableRedisWebSession 时,同样会触发自动配置退避。不要以为 reactive 另有一套属性前缀------存储选项仍在 spring.session.data.redis.*,连接仍在 spring.data.redis.*。
本稿只把「升版当天能改对、能验收」的最小闭环写清楚。并发会话、自定义 SessionRepository 等更深策略请回 Spring Session 本尊文档,别在属性 rename 文里硬塞。
生产切换时还有一个容易忽略的点:若旧集群里已经堆了大量 spring:session:* 键,改的是应用读写下标与配置,一般不必为了 rename 去扫库删历史键;让旧键按原 TTL 过期即可。真正要做的是确认新实例写入的 namespace 与网关/多实例读路径一致,避免滚动发布窗口出现「一半实例读新配置、一半仍旧前缀」的分裂。灰度顺序建议:先改配置与依赖并完成单实例验收,再滚动其余节点。
FAQ
Boot4 升后 spring.session.redis 为什么不生效?
属性已 rename 为 spring.session.data.redis.*,旧前缀不再绑定 Session Data Redis 配置。
要改成哪一串前缀?
spring.session.redis.* → spring.session.data.redis.*;绑定类 SessionDataRedisProperties。
starter 名字有没有变?
使用 spring-boot-starter-session-data-redis(测试可用 spring-boot-starter-session-data-redis-test)。
spring.data.redis 连接配置要不要一起改?
不要。连接仍是 spring.data.redis.*;改的是 Session 存储前缀。
怎么验证 Session 已经写进 Redis?
看启动日志、Redis 中 namespace(默认 spring:session)下的 key,以及登录态是否跨请求/实例保持。
小结 checklist
- 全局替换:
spring.session.redis.*→spring.session.data.redis.* - 依赖改为
spring-boot-starter-session-data-redis(按需 test companion) - 确认
SessionDataRedisProperties/ 新前缀;按需核对六项默认 - 保留
spring.session.timeout;勿改spring.data.redis.*连接键名 - 排查
@Enable*HttpSession/@EnableRedisWebSession是否导致 back off - 可选 migrator 诊断 → 用完删除
- 验收:日志 + Redis namespace/key + 登录态
- Hazelcast 移除 / Mongo 一句边界即可,不抢主线
按「换前缀 → 换 starter → 分清连接与 Session → 避开手写启用陷阱 → Redis 与登录态验收」改完,这类 Boot4 Session Redis 属性改名踩坑通常一次就能闭环,比在过滤器链里猜「是不是序列化问题」省事。