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>
<!--sessionJDBC的实现-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>
<!--JDBC的自动化配置,有了则可以使使用spring.datasource配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--我这里用MySQL存储,因此需要MySQL驱动-->
<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之后,数据库表数据如下

b9bf5774fa6ca25a411f3d1a8a5f8f57

3. 高级配置

默认的sessionId是从Cookie中拿的,我们也可以不从Cookie中拿,用前后端分离中常用的token模式,将sessionId放入token中

需要添加配置类

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class SessionRedisConfig {

/**
* 使用 Header方式获取sessionID
* @return
*/
@Bean
HttpSessionIdResolver sessionIdResolver() {
return new HeaderHttpSessionIdResolver("token");
}
}