Spring Session 把 HTTP Session 保存到 Redis,多实例可以读取同一会话。浏览器仍通过 Cookie 携带 Session ID;Redis 不是直接用来保存用户密码。
依赖与配置
下面适用于 Spring Boot 3.x 的 Servlet Web 项目,版本由项目的 Spring Boot BOM 管理。加入两个依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId></dependency>先按 Redis Docker 教程 启动服务,再配置 application.yaml:
spring: data: redis: host: 127.0.0.1 port: 16379 session: timeout: 30m redis: namespace: tutorial:sessionserver: servlet: session: cookie: http-only: true same-site: laxSpring Boot 3 可根据依赖自动配置 Redis Session,不需要旧的 spring.session.store-type。spring.data.redis.ttl 不是控制 HTTP Session 过期的属性。
会话何时产生
登录代码将服务端确认的用户标识写入会话,例如 request.getSession().setAttribute("userId", userId)。登录成功应更新会话 ID;退出时调用 session.invalidate()。写入操作仍需由已有的认证逻辑决定,不能把任意客户端提交的 userId 当作已登录身份。
用浏览器完成一次登录,在开发者工具查看响应的 Session Cookie,再检查 Redis 中是否生成 tutorial:session 前缀的键。默认 Spring Session Cookie 常见名称为 SESSION,以实际响应为准。
timeout 是会话闲置过期时间,Cookie 的 max-age 是浏览器保存期限,两者作用不同。Cookie 还在并不代表服务端会话仍有效。使用 HTTPS 时再配置 secure=true,跨站 Cookie 还需结合 SameSite、CORS 和 CSRF 设计。
评论