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.conf
1.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>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<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.88.101
port: 27017
database: sxt
#在SpringSession中没配置是因为SpringSession默认是基于redis做数据缓存的,SpringSessionMongoDB默认就是基于MongoDB的不配也可以
session:
store-type: mongodb
2.4.2Session_mongo2
#配置服务的端口
server:
port: 8081
#配置MongoDB的链接信息
spring:
data:
mongodb:
host: 192.168.88.101
port: 27017
database: sxt
#在SpringSession中没配置是因为SpringSession默认是基于redis做数据缓存的,SpringSessionMongoDB默认就是基于MongoDB的不配也可以
session:
store-type: mongodb
2.5 创建启动类
2.5.1Session_mongo1
package com.bjsxt.mongo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.mongo.config.annotation.web.http.EnableMongoHttpSession;
@SpringBootApplication
@EnableMongoHttpSession//调用session自动去MongoDB中存取
public class ApplicationMongo1 {
public static void main(String[] args) {
SpringApplication.run(ApplicationMongo1.class, args);
}
}
2.5.2Session_mongo2
package com.bjsxt.mongo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.mongo.config.annotation.web.http.EnableMongoHttpSession;
@SpringBootApplication
@EnableMongoHttpSession//调用session自动去MongoDB中存取
public class ApplicationMongo2 {
public static void main(String[] args) {
SpringApplication.run(ApplicationMongo2.class, args);
}
}
3 编写测试代码
3.1Session_mongo1
package com.bjsxt.mongo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController
@RequestMapping("/service1")
public class Controller {
/**
* 将数据存放到HTTPSession中
*/
@RequestMapping("/setMsg")
public String setMsg(HttpSession session, String msg) {
session.setAttribute("msg", msg);
return "ok";
}
}
3.2Session_mongo2
package com.bjsxt.mongo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController
@RequestMapping("/service2")
public class Controller {
/**
* 从HTTPSession中获取数据
*/
@RequestMapping("/getMsg")
public String getMsg(HttpSession session) {
String msg = (String) session.getAttribute("msg");
return msg;
}
}
3.3 修改 MongoDB 的配置文件添加 bind_ip
如果不配置,mongodb只能允许当前主机连接,配置之后允许任何主机连接,去掉 auth=true 否则连接需要认证
3.4测试
4 共享自定义对象
4.1 创建 Users
package com.bjsxt.mongo.domin;
import java.io.Serializable;
/**
* 需要实现序列化接口
*/
public class Users implements Serializable {
private String userpwd;
private String username;
public String getUserpwd() {
return userpwd;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
4.2session_mongo1
/**
* 获取数据封装Users
*/
@RequestMapping("/setUsers")
public String setUsers(HttpSession session, Users users) {
session.setAttribute("u", users);
return "ok";
}
4.3session_mongo2
/**
* 从httpSession中获取Users
*/
@RequestMapping("/getUsers")
public Users getUsers(HttpSession session) {
Users users = (Users) session.getAttribute("u");
return users;
}
4.4测试
5 Spring Session MongoDB 的存结构
6 设置 Session 失效时间
删掉之前的数据
设置失效时间
失效时间到了之后不是立即删除数据,而是等一会
service2拿不到数据了
刷新service1再放一条数据,在失效时间内可以拿到
service1和service2共享一个session,service1 的失效时间是20S但service2是默认的1800S,如果service1的失效时间还没到,这时service2又去请求了,service2还能拿到数据是因为service2去请求的时候将session的失效时间重置了变成了1800S,session为失效,数据未销毁,所以还能拿到数据
7 @EnableMongoHttpSession 注解讲解
maxInactiveIntervalInSeconds:设置 Session 失效时间
collectionName:设置 MongoDB 的 Collections 的名称
设置collectionName为 sxtCollection
service2 未设置collectionName所以取不到数据 默认是去session这个集合中取的
但是在MongoDB中是有的
8 更换 Spring Session MongoDB 的序列化器
Spring Session MongoDB 默认使用的是 JDK 序列化器。
8.1 创建配置类添加 Jackson
package com.bjsxt.mongo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.mongo.JacksonMongoSessionConverter;
/**
* 更换Spring Session MongoDB的序列化器
*/
@Configuration//让spring在启动时初始化这个类
public class SessionMongoConfig {
@Bean
JacksonMongoSessionConverter mongoSessionConverter() {
return new JacksonMongoSessionConverter();
}
}
8.2 修改实体类,添加@JsonAutoDetect 注解
package com.bjsxt.mongo.domin;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import java.io.Serializable;
/**
* 需要实现序列化接口
*/
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)//忽略所有属性的自动检测
public class Users implements Serializable {
private String userpwd;
private String username;
public String getUserpwd() {
return userpwd;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
8.3测试
service2 未更换序列化器所以报错
更换同款序列化器之后成功