<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.</modelVersion>
<groupId>com.bjsxt</groupId>
<artifactId>spring_session</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>session_service1</module>
<module>session_service2</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1..RELEASE</version>
</parent><dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-bom</artifactId>
<version>Bean-SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--web Starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Redis Starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
<!--Spring session data redis-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<!--Lettuce 是一个基于Netty的NIO方式处理Redis的技术-->
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>
</dependencies>
</project>
3 添加配置文件
3.1session_service1
#服务端口
server:
port: 8080
spring:
redis:
host: 192.168.70.156 #Redis 配置
port: 6379
password:
database: 0
3.2session_service2
#服务端口
server:
port: 8081
spring:
redis:
host: 192.168.70.156 #Redis 配置
port: 6379
password:
database: 0
4 创建启动类
4.1session_service1
@SpringBootApplication@EnableRedisHttpSession
public class Service1Application {
public static void main(String[] args){
SpringApplication.run(Service1Application.class,args);
}
}
4.2session_service2
@SpringBootApplication
@EnableRedisHttpSession
public class Service2Application {
public static void main(String[] args){
SpringApplication.run(Service2Application.class,args);
}
}
5 编写测试代码测试效果
5.1session_service1
5.1.1创建 Controller
@RestController
@RequestMapping("service1")
public class WebController {
@RequestMapping("/setMsg")
public String setMsg(HttpSession session,String msg){
session.setAttribute("msg",msg);
return "ok";
}
}
5.2session_service2
5.2.1创建 Controller
@RestController
@RequestMapping("/service2")
public class WebController {
@RequestMapping("/getMsg")
public String getMsg(HttpSession session){
String msg = (String) session.getAttribute("msg");
return msg;
}
}
5.2.2测试

6 共享自定义对象
6.1创建 Users 实体类
public class Users implements Serializable {
private String username;
private String userpwd;
public String getUsername() {
return username;
}public String getUserpwd() {
return userpwd;
}
public void setUsername(String username) {
this.username = username;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
}
6.2修改 session_service1 的 controller
@RestController
@RequestMapping("service1")
public class WebController {
@RequestMapping("/setMsg")
public String setMsg(HttpSession session,String msg){
session.setAttribute("msg",msg);
return "ok";
}
/**
* 获取 Users 信息,保存到 HttpSession 中
*/
@RequestMapping("/addUsers")
public String addUsers(HttpSession session, Users users){
session.setAttribute("u",users);
return "ok";
}
}
6.3修改 session_service2 的 controller
@RestController@RequestMapping("/service2")
public class WebController {
@RequestMapping("/getMsg")
public String getMsg(HttpSession session){
String msg = (String) session.getAttribute("msg");
return msg;
}
/**
* 获取 HttpSession 中的 Users 对象
*/
@RequestMapping("/getUsers")
public Users getUsers(HttpSession session){
Users users = (Users) session.getAttribute("u");
return users;
}
}
6.4测试

7 Spring Session 的 Redis 存储结构
spring:session:expirations:(Set 结构)用户 ttl 过期时间记录
这个 k 中的值是一个时间戳,根据这个 Session 过期时刻滚动至下一分钟而计算得出。
这个 k 的过期时间为 Session 的最大过期时间 + 5 分钟。
spring:session:sessions:(Hash 结构)
maxInactiveInterval:过期时间间隔
creationTime:创建时间lastAccessedTime:最后访问时间
sessionAttr:Attributes 中的数据
存储 Session 的详细信息,包括 Session 的过期时间间隔、最后的访问时间、attributes
的值。这个 k 的过期时间为 Session 的最大过期时间 + 5 分钟。
spring:session:sessions:expires:(String 结构)过期时间记录
这个 k-v 不存储任何有用数据,只是表示 Session 过期而设置。
这个 k 在 Redis 中的过期时间即为 Session 的过期时间间隔。
8 设置 Session 的失效时间
8.1在注解中设置失效时间
@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=)
public class Service1Application {
public static void main(String[] args){
SpringApplication.run(Service1Application.class,args);
}
}
9 @EnableRedisHttpSession 注解讲解
9.1maxInactiveIntervalInSeconds
设置 Session 的失效时间,单位为秒。默认(1800 秒)30 分钟。
9.2redisNamespace
为键定义唯一的命名空间。该值用于通过更改前缀与默认 spring:session 隔离会话
9.3redisFlushMode
Redis 会话的刷新模式。默认值为“保存”
9.4cleanupCron
过期会话清理作业的 cron 表达式。默认值("0 * * * * *")每分钟运行一次。10 更换 Spring Session 的序列化器
Spring Session 中默认的序列化器为 jdk 序列化器,该序列化器效率低下,内存再用大。
我们可以根据自己的需要更换其他序列化器,如 GenericJackson2JsonRedisSerializer 序列化
器。
10.1在配置类中创建自定义序列化器
@Configuration
public class SpringSessionConfig {
/**
* 更换默认的序列化器
*
*/
@Bean("springSessionDefaultRedisSerializer")
public RedisSerializer defaultRedisSerializer(){
return getSerizlizer();
}
/**
* 定义序列化器
*/
private RedisSerializer getSerizlizer(){
return new GenericJackson2JsonRedisSerializer();
}
}
10.2测试

Spring Session MongoDB
一、 Spring Session MongoDB 简介
1 什么是 Spring Session MongoDB
Spring Session MongoDB 是 Spring Session 的二级项目。其功能与 Spring Session 是相同
的。Spring Session MongoDB 提供了一个 API 和实现,用于通过利用 Spring Data MongoDB
来管理存储在 MongoDB 中的用户会话信息。
2 他与 Spring Session 的区别
Spring Session 与 Spring Session MongoDB 的作用是相同的。都是来解决 Session 共享问
题。不同的是 Spring Session 默认的是依赖于 Redis 作为数据缓存平台,而 Spring Session
MongoDB 是依赖于 MongoDB 来作为数据缓存平台的。
二、 Spring Session MongoDB 的使用
1 安装 MongoDB
1.1下载 MongoDB
mongodb-linux-x86_64-4.0.9.tgz
1.2解压 tgz 文件
[root@localhost temp]# tar -zxf mongodb-linux-x86_64-4.0.9.tgz
1.3创建数据库目录
[root@localhost etc]# mkdir -p data/db
1.4创建日志文件
[root@localhost etc]# touch mongodb.log
1.5创建配置文件
[root@localhost etc]# vim mongodb.conf1.6启动 MongoDB
[root@localhost bin]# ./mongod --cofnig /usr/local/mongodb/etc/mongodb.conf
1.7创建 sxt 库
> use sxt
2 搭建案例环境
2.1技术版本
JDK:1.8
Spring Boot:2.1.6RELEASE
Spring Session MongoDB:Bean-SR3
2.2创建项目
2.3修改 POM 文件添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjsxt</groupId>
<artifactId>session_mongodb</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>session_mongo1</module>
<module>session_mongo2</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-bom</artifactId>
<version>Bean-SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-mongodb</artifactId>
</dependency>
</dependencies>
</project>
2.4添加配置文件
2.4.1Session_monog1
#配置服务的端口
server:
port: 8080
#配置 MongoDB 的链接信息
spring:
data:
mongodb:
host: 192.168.70.156
port: 27017
database: sxt
session:
store-type: mongodb
2.4.2Session_mongo2
#配置服务的端口
server:
port: 8081
#配置 MongoDB 的链接信息
spring:data:
mongodb:
host: 192.168.70.156
port: 27017
database: sxt
session:
store-type: mongodb
2.5创建启动类
2.5.1Session_mongo1
@SpringBootApplication
@EnableMongoHttpSession
public class Mongo1Application {
public static void main(String[] args){
SpringApplication.run(Mongo1Application.class,args);
}
}
2.5.2Session_mongo2
@SpringBootApplication
@EnableMongoHttpSession
public class Mongo2Application {
public static void main(String[] args){
SpringApplication.run(Mongo2Application.class,args);
}
}3 编写测试代码
3.1Session_mongo1
@RestController
@RequestMapping("/service1")
public class WebController {
/**
* 将数据存放到 HttpSession 中
*/
@RequestMapping("/setMsg")
public String getMsg(HttpSession session,String msg){
session.setAttribute("msg",msg);
return "ok";
}
}
3.2Session_mongo2
@RestController
@RequestMapping("/service2")
public class WebController {
/**
* 获取 HttpSession 中的数据
*/
@RequestMapping("/getMsg")
public String getMsg(HttpSession session){
String msg = (String) session.getAttribute("msg");
return msg;
}
}
3.3修改 MongoDB 的配置文件添加 bind_ip
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/log/mongodb.logport=27017
fork=true
bind_ip=0.0.0.0
3.4测试
4 共享自定义对象
4.1创建 Users 类
public class Users implements Serializable {
private String username;
private String userpwd;
public String getUsername() {
return username;
}
public String getUserpwd() {
return userpwd;
}
public void setUsername(String username) {
this.username = username;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}}
4.2session_mongo1
@RestController
@RequestMapping("/service1")
public class WebController {
/**
* 将数据存放到 HttpSession 中
*/
@RequestMapping("/setMsg")
public String getMsg(HttpSession session,String msg){
session.setAttribute("msg",msg);
return "ok";
}
/**
* 获取数据封装 Users
*/
@RequestMapping("/setUsers")
public String setUsers(HttpSession session, Users users){
session.setAttribute("users",users);
return "ok";
}
}
4.3session_mongo2
@RestController
@RequestMapping("/service2")
public class WebController {
/**
* 获取 HttpSession 中的数据
*/
@RequestMapping("/getMsg")public String getMsg(HttpSession session){
String msg = (String) session.getAttribute("msg");
return msg;
}
/**
* 从 HttpSession 中获取 Users
*/
@RequestMapping("/getUsers")
public Users getUsers(HttpSession session){
Users users = (Users) session.getAttribute("users");
return users;
}
}
4.4测试
5 Spring Session MongoDB 的存结构
{
"_id"
:
"fe3f6cea-c3e2-426b-a47a-cf21c5b848cb",
"created"
:
ISODate("2019-07-12T12:46:48.916Z"), "accessed" : ISODate("2019-07-12T12:46:48.919Z"),
"interval" : "PT30M", "principal" : null, "expireAt" : ISODate("2019-07-12T13:16:48.919Z"),
"attr"
:
BinData(0,"rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9h
ZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAABdAAFdXNlcnN
zcgAcY29tLmJqc3h0Lm1vbmdvLmRvbWFpbi5Vc2Vyc5EM02IkljhzAgACTAAIdXNlcm5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztMAAd1c2VycHdkcQB+AAR4cHQABWFkbWludAAF
YWRtaW54") }
6 设置 Session 失效时间
@SpringBootApplication
@EnableMongoHttpSession(maxInactiveIntervalInSeconds=10)
public class Mongo1Application {
public static void main(String[] args){
SpringApplication.run(Mongo1Application.class,args);
}
}
7 @EnableMongoHttpSession 注解讲解
maxInactiveIntervalInSeconds:设置 Session 失效时间
collectionName:设置 MongoDB 的 Collections 的名称
8 更换 Spring Session MongoDB 的序列化器
Spring Session MongoDB 默认使用的是 JDK 序列化器。
8.1创建配置类添加 Jackson 序列化器
/**
* 更换 Spring Session MongoDB 的序列化器
*/
@Configuration
public class SessionMongoConfig {
@Bean
JacksonMongoSessionConverter mongoSessionConverter() {
return new JacksonMongoSessionConverter();
}
}8.2修改实体类,添加@JsonAutoDetect 注解
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility
.ANY)
public class Users implements Serializable {
private String username;
private String userpwd;
public String getUsername() {
return username;
}
public String getUserpwd() {
return userpwd;
}
public void setUsername(String username) {
this.username = username;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
}
8.3测试