必须使用spring-session-data-redis,因其提供HTTP Session与Redis集成的自动拦截逻辑,而spring-boot-starter-data-redis仅支持基础Redis操作,不处理Session存储;缺少它会导致session仍存内存、分布式不共享等问题。
必须用 spring-session-data-redis,不能只用 spring-boot-starter-data-redis 或旧版 spring-session。后者不提供自动 Session 存储能力,缺它就根本不会把 session 写进 Redis。
spring-boot-starter-data-redis 不行这个 starter 只负责让 Spring Boot 能连上 Redis、操作 key-value,它完全不知道 HTTP Session 是什么。Session 管理需要额外的拦截逻辑(比如在请求进来时从 Redis 加载 session、响应出去时刷回 Redis),这部分由 spring-session-data-redis 提供。
常见错误现象:
redis-cli keys * 查不到 spring:session: 开头的 keyspring-session-data-redis 的依赖写法(Maven)Spring Boot 2.4+ 推荐使用以下写法(无需指定版本,由 Spring Boot BOM 管理):
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId></dependency>
注意点:
spring-session(无 data-redis 后缀)—— 它是老一代抽象层,和当前 Boot 版本不兼容spring-boot-starter-redis(1.x 时代产物,2.x 起已移除)spring-session-data-redis 版本 ≥ 对应 Boot 版本(例如 2.1.x 对应 2.1.x)@EnableRedisHttpSession 还要不要加Spring Boot 2.0+ 默认启用自动配置,只要 classpath 有 spring-session-data-redis,且 spring.session.store-type=redis(或未显式设为 none),就会自动装配 Redis-backed Session。
但建议显式加注解,原因:
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800) 比配置文件更直观redisNamespace 隔离不同环境的 session key,防止冲突不加注解时,server.servlet.session.timeout 会被忽略;加了之后,maxInactiveIntervalInSeconds 才真正生效。
spring-session-data-redis 默认用 JdkSerializationRedisSerializer,这意味着存入 session 的所有对象都必须实现 Serializable。否则会静默失败(session 写不进 Redis,但也不报错)。
推荐做法:
GenericJackson2JsonRedisSerializer(需自定义 RedisTemplate bean)HttpSession 放的对象是简单 POJO 或基本类型,避免塞 HttpServletRequest、Connection 等不可序列化对象redis-cli monitor 观察是否有 SET 命令失败,或检查日志中是否出现 Cannot serialize 类似提示