spring sesion
- 环境:在spring boot基础上开发
- spring-session是spring旗下的一个项目,把servlet容器实现的httpSession替换为spring-session,专注于解决 session管理问题。可简单快速且无缝的集成到我们的应用中。
spring session jdbc
spring session jdbc使用
- 环境:使用mysql数据库存储sesion信息
- pom.xml文件添加session jdbc的依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
-
application.yml配置
server: servlet: session: # sesion失效时间配置,默认30分钟 # * "PT20.345S" -- parses as "20.345 seconds" # * "PT15M" -- parses as "15 minutes" (where a minute is 60 seconds) # * "PT10H" -- parses as "10 hours" (where an hour is 3600 seconds) # * "P2D" -- parses as "2 days" (where a day is 24 hours or 86400 seconds) # * "P2DT3H4M" -- parses as "2 days, 3 hours and 4 minutes" # * "P-6H3M" -- parses as "-6 hours and +3 minutes" # * "-P6H3M" -- parses as "-6 hours and -3 minutes" # * "-P-6H+3M" -- parses as "+6 hours and -3 minutes" timeout: PT30M spring: # 数据库配置 datasource: ##引用自己的mysql url: jdbc:mysql://localhost:3306/database?serverTimezone=UTC username: username password: password driver-class-name: com.mysql.cj.jdbc.Driver # session配置 session: # jdbc关系型数据库,等价于@EnableJdbcHttpSession注解 # redis 使用redis数据库存储,等价于@EnableRedisHttpSession注解 store-type: jdbc # 同server.servlet.session.timeout属性 #timeout: PT30M jdbc: # 过期会话清理作业的Cron表达式 cleanup-cron: 10 * * * * * # 支持跟踪和保存会话更改到会话存储的模式。 # ON_SET_ATTRIBUTE,对session更改的时候,保存属性,默认使用 # ON_GET_ATTRIBUTE,对session更改和读取都保存数据 # ALWAYS,始终保存所有会话属性,不管与会话的交互如何。(测试和ON_SET_ATTRIBUTE一样) save-mode: ON_GET_ATTRIBUTE # 支持将会话写入会话存储的模式 # ON_SAVE:响应完成调用SessionRepository#save(Session)的时候才保存到数据库,默认使用 # IMMEDIATE:创建session和设置session值后就立即保存到数据库 flush-mode: ON_SAVE #指定表名,默认表名为spring_session(还会在这个基础上创spring_session_attributes表) # table-name: spring_session
-
初始化sql,以mysql为例,其他的可以在spring-session-jdbc包下的schema-*.sql查找,如果表名修改了,只需要把相应的SPRING_SESSION修改即可
CREATE TABLE SPRING_SESSION ( PRIMARY_ID CHAR(36) NOT NULL, SESSION_ID CHAR(36) NOT NULL, CREATION_TIME BIGINT NOT NULL, LAST_ACCESS_TIME BIGINT NOT NULL, MAX_INACTIVE_INTERVAL INT NOT NULL, EXPIRY_TIME BIGINT NOT NULL, PRINCIPAL_NAME VARCHAR(100), CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID) ); CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID); CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME); CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME); CREATE TABLE SPRING_SESSION_ATTRIBUTES ( SESSION_PRIMARY_ID CHAR(36) NOT NULL, ATTRIBUTE_NAME VARCHAR(200) NOT NULL, ATTRIBUTE_BYTES LONGVARBINARY NOT NULL, CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME), CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE );
注意
- 如果需要在session中存bean的话,bean需要实现Serializable接口
- 如果用户登陆后,关闭程序,不注销,不关闭网页,重启程序后,用户会仍然是登陆状态
spring session jdbc实现session同步的原理
- 通过SessionRepositoryFilter实现把servlet容器实现的httpSession替换为spring-session
- JdbcIndexedSessionRepository实现session的增删改查,可以自定义该类
spring session redis
spring session redis使用
-
环境:使用redis数据库存储sesion信息,存储类型为哈希格式
-
pom.xml文件添加session redis的依赖
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
application.yml配置
server:
servlet:
session:
# sesion失效时间配置,默认30分钟
# * "PT20.345S" -- parses as "20.345 seconds"
# * "PT15M" -- parses as "15 minutes" (where a minute is 60 seconds)
# * "PT10H" -- parses as "10 hours" (where an hour is 3600 seconds)
# * "P2D" -- parses as "2 days" (where a day is 24 hours or 86400 seconds)
# * "P2DT3H4M" -- parses as "2 days, 3 hours and 4 minutes"
# * "P-6H3M" -- parses as "-6 hours and +3 minutes"
# * "-P6H3M" -- parses as "-6 hours and -3 minutes"
# * "-P-6H+3M" -- parses as "+6 hours and -3 minutes"
timeout: PT30M
spring:
redis:
host: 127.0.0.1
port: 6379
# 数据库配置
datasource:
##引用自己的mysql
url: jdbc:mysql://localhost:3306/database?serverTimezone=UTC
username: username
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
# session配置
session:
# jdbc关系型数据库,等价于@EnableJdbcHttpSession注解
# redis 使用redis数据库存储,等价于@EnableRedisHttpSession注解
store-type: redis
# 同server.servlet.session.timeout属性
#timeout: PT30M
redis:
# 过期会话清理作业的Cron表达式
cleanup-cron: 10 * * * * *
# 支持跟踪和保存会话更改到会话存储的模式。
# ON_SET_ATTRIBUTE,对session更改的时候,保存属性,默认使用
# ON_GET_ATTRIBUTE,对session更改和读取都保存数据
# ALWAYS,始终保存所有会话属性,不管与会话的交互如何。(测试和ON_SET_ATTRIBUTE一样)
save-mode: ON_GET_ATTRIBUTE
# 支持将会话写入会话存储的模式
# ON_SAVE:响应完成调用SessionRepository#save(Session)的时候才保存到数据库,默认使用
# IMMEDIATE:创建session和设置session值后就立即保存到数据库
flush-mode: ON_SAVE
#指定表名,默认表名为spring_session(还会在这个基础上创spring_session_attributes表)
# table-name: spring_session
spring session redis实现session同步的原理
- 通过SessionRepositoryFilter实现把servlet容器实现的httpSession替换为spring-session
- RedisIndexedSessionRepository实现session的增删改查,可以自定义该类
网友评论