官网:https://spring.io/projects/spring-session
Samples:https://docs.spring.io/spring-session/reference/samples.html#samples
指引
- Spring Session – HttpSession Integration HttpSession集成
- Spring Session – WebSocket Integration WebSocket 集成
- Spring Session – WebSession Integration WebSession 集成
- Spring Session – Spring Security Integration Spring Security 集成
介绍
Spring Session 提供管理用户会话信息的 API 和实现
特性
Spring Session 使支持集群会话变得简单,而无需绑定到特定于应用程序容器的解决方案,还提供与以下各项的透明集成
HttpSession
允许以中立的方式替换应用程序容器(即Tomcat)中的 HttpSession,并支持在标头(head)中提供会话ID(session IDs)以使用 RESTful APIWebSocket
提供在接收 WebSocket 消息时保持 HttpSession 活动状态的能力WebSession
允许以中立的方式替换应用程序容器(即Tomcat)中的 Spring WebFlux 的 WebSession
模块
Spring Session Core
提供核心Spring Session 功能和API- **
Spring Session Data Redis
**提供由 Redis 支持的 SessionRepository 和 ReactiveSessionRepository 实现和配置支持 Spring Session JDBC
提供由关系数据库支持的 SessionRepository 实现和配置支持Spring Session Hazelcast
提供由 Hazelcast 支持的 SessionRepository 实现和配置支持Spring Session MongoDB
提供由 MongoDB 支持的 SessionRepository 实现和配置支持
- SessionRepository 会话存储库
- ReactiveSessionRepository 响应式会话存储库
- Configuration Support 配置支持
会话认证鉴权策略:Cookie Session Token
1. Cookie
客户端保存用户会话信息的机制(客户端请求,服务器响应时响应头包含Set-Cookie,客户端保存,客户端请求时请求头包含Cookie),实现 Session 的一种方式。但存储数据量有限(一般不超过4KB),都是保存在客户端浏览器中,当浏览器的会话关闭后自动消失。无法跨域访问,需要考虑CSRF
2. Session
服务器保存用户会话信息的机制(客户端请求,服务器新建生成 Session 对象映射 session id,通过 Cookie 传值响应,客户端请求时请求头的Cookie值包含 sessionId 键值对)。但在集群分布式系统中不同服务器无法共享同一个用户的会话认证鉴权。有以下解决方案:
- Session 复制。但存在数据冗余、性能消耗大(同一份 Session 在不同服务器保存一份)
- Session 粘连。Nginx 的 sticky 模块绑定服务器策略 支持按 ip 或 cookie 粘连等(即不支持负载均衡或服务器宕机后没有备用机)
- Session 共享(集群)。Spring Session 实现分布式 Session
- No Session。Token
3. Token
令牌 服务器生成的紧凑,可验证的字符串,客户端保存,服务器可选择性保存(保存即与 Session 一样为有状态;不保存即为无状态)。通常由三部分组成:header(至少需要指定用于签署JWT的算法)、payload(body JWT编码的所有标准声明 包含用户信息)、signature(sign 将header和body的组合后,通过密钥和算法(header中指定)计算出来),具有支持跨域访问(无须考虑CSRF)、无状态、基于标准化(JSON Web Token JWT)、适用于移动端应用等优点,但占带宽(比sessionId的值要更大)、无法在服务器注销(使令牌成为有状态的情况下即可对其注销)