1. 说明 springSession 基于 Redis实现需要集成redis,框架本身只做了兼容redis存储,如果没有redis的话是会报错的。
2. 框架搭建 2.1. 引入依赖 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <dependencies > <dependenc > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-web</artifactId > </dependency > <dependency > <groupId > org.springframework.session</groupId > <artifactId > spring-session-jdbc</artifactId > </dependency > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-jdbc</artifactId > </dependency > <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > </dependency > </dependencies >
2.2. application配置文件 1 2 3 4 5 6 7 8 spring: session: store-type: jdbc datasource: url: jdbc:mysql://...... username: kewen password: ...... driver-class-name: com.mysql.cj.jdbc.Driver
这里 spring.session.store-type=jdbc
可以不配置,换做另一种注解配置方法
配置类添加注解@EnableJdbcHttpSession
即可。
1 2 3 4 5 @Configuration @EnableJdbcHttpSession(maxInactiveIntervalInSeconds = 3600) public class SessionJdbcConfig {}
2.3. 启动类启动 1 2 3 4 5 6 @SpringBootApplication public class D118SpringSessionRedisApp { public static void main (String[] args) { SpringApplication.run(D118SpringSessionRedisApp.class, args); } }
2.4. 数据库初始化 SpringSession 框架中提供了各种数据库的初始化脚本,位置在org.springframework.session.jdbc
下 当然也可以从org.springframework.session.jdbc.JdbcIndexedSessionRepository
类中去查看SQL语句得到表结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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) ) engine= innodb row_format= dynamic ; 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 blob 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 ) engine= innodb row_format= dynamic ;
这样基于JDBC的配置就完成了。
这里需要注意SpringSession JDBC方式存储可能导致报错 :
SPRING_SESSION_ATTRIBUTES 采用的是BLOB数据类型存储,框架里是将其序列化之后存放在数据库中,反序列化时依赖对象的serialVersionUID
不要变化,否则会导致已经保存在数据库中的session反序列化失败从而报错。
2.5. 启动 启动成功保存session之后,数据库表数据如下
3. 高级配置 默认的sessionId是从Cookie中拿的,我们也可以不从Cookie中拿,用前后端分离中常用的token模式,将sessionId放入token中
需要添加配置类
1 2 3 4 5 6 7 8 9 10 11 12 @Configuration public class SessionRedisConfig { @Bean HttpSessionIdResolver sessionIdResolver () { return new HeaderHttpSessionIdResolver ("token" ); } }