如何在Spring Boot中通过Redis管理Session会话_引入spring-session-data-redis依赖

作者:袖梨 2026-07-10
必须使用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: 开头的 key
  • 重启服务后用户仍保持登录(说明 session 还在内存里,没走 Redis)
  • 分布式部署下 session 无法共享,节点间状态不一致

spring-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 Boot(如 2.1.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。

但建议显式加注解,原因:

  • 明确表达意图,避免因配置遗漏导致 fallback 到内存 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 或基本类型,避免塞 HttpServletRequestConnection 等不可序列化对象
  • 上线前用 redis-cli monitor 观察是否有 SET 命令失败,或检查日志中是否出现 Cannot serialize 类似提示

相关文章

精彩推荐