概述
Spring Session提供了用户会话管理的API和实现。
特性
Spring Session支持集群会话管理解决方案,且无需绑定到特定的应用程序容器。
提供一些透明的集成:
HttpSession
- 在容器(tomcat)中性方式替换HttpSession,提供session id在header中和restful API一起使用。WebSocket
- 提供了在WebSocket接收消息的时,保持HttpSession alive的能力。WebSession
- 允许在应用程序容器用中立的替换 Spring WebFlux 的 WebSession。
组成模块
Spring Session Core - 核心功能和API
Spring Session Data Redis - 提供Redis支持的SessionRepository和ReactiveSessionRepository实现和配置支持。
Spring Session JDBC - 提供关系型数据库的SessionRepository实现和配置支持。
Spring Session Hazelcast - 提供Hazelcast的SessionRepository实现和配置支持。
总之:spring session实现了对redis、jdbc、hazelcast、mongdb、apache geode会话管理的支持。当前web应用分为Servlet Web应用和Recative web应用,对Reactive的支持提供自动配置支持Redis和MongoDB。
示例
所有示例基于Version 2.5.1
Spring Boot整合Redis会话管理
SpringBoot整合redis做session共享
1、添加maven依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>复制
2、Spring Boot配置
application.properties
spring.session.store-type=redis # 会话存储类型配置声明。
# 该配置相当于手动添加了@EnableRedisHttpSession注解。(同理这一类注解还有针对其他存储方式的注解@Enable*HttpSession。)该注解会启动创建一个Filter-springSessionRepositoryFilter.该filter负责替换HttpSession为SpringSession。
# 如果是反应式的web应用,则相当于手动添加@Enable*WebSession
# 这以上的配置spring session都做了自动配置。
# 如果要禁用spring session可以配置如:spring.session.store-type=none
server.servlet.session.timeout = # 会话超时。如果未指定持续时间后缀,则使用秒。
# 关于会话超时设置优先级问题注意:可以通过`spring.session.timeout`设置过期时间。如果Servlet Web没有设置该属性,则自动配置退回server.servlet.session.timeout
spring.session.redis.flush-mode=on_save # 会话刷新模式。
spring.session.redis.namespace=spring:session # 用于存储会话的键的命名空间。复制
注意:配置具有优先级,优先级从高到低:@Enable*Session
>spring.session.timeout
>server.servlet.session.timeout
。注解配置如:@Enable*HttpSession(Servlet)
或@Enable*WebSession(Reactive)
配置。如果使用了注解配置,则配置文件中自动配置会自动退出。具体的属性配置如timeout等可以使用注解的属性进行配置。示例:@EnableJdbcHttpSession(maxInactiveIntervalInSeconds = 1800)
配置了过期时间为1800秒。
3、配置redis连接
spring.redis.host=localhost # Redis server host.
spring.redis.password= # Login password of the redis server.
spring.redis.port=6379 # Redis server port.复制
更多配置信息参考:https://docs.spring.io/spring-boot/docs/2.4.7/reference/htmlsingle/#boot-features-connecting-to-redis
4、Servlet容器初始化
以上springboot的配置做了什么,底层的逻辑是,spring boot自动配置创建了一个Filter,springSessionRepositoryFilter的bean,该bean负责用Spring Session替换HttpSession。
spring需加载配置类,springSessionRepostiryFilter
对所有请求过滤,以上动作都由springboot自动完成。