SpringSession
第一章 HttpSession
一、 HttpSession 回顾
二、 Session 共享
三、SpringSession的简介
四、 SpringSession 的使用
安装Redis单机版
共享简单数据
共享自定义对象
SpringSession 的 Redis 存储结构
设置session的失效时间
@EnableRedisHttpSession注解中相关属性讲解
更换 SpringSession 的序列化器
第二章 Spring Session MongoDB
一、SpringSessionMongoDB 简介
二、Spring Session MongoDB 的使用
安装MongoDB单机版
共享简单数据
共享自定义对象

SpringSession MongoDB 的存储结构

设置session的失效时间

@EnableMongoHttpSession 注解中相关属性讲解

更换 SpringSession 的序列化器

第一章 HttpSession

一、 HttpSession 回顾

什么是 HttpSession
是 JavaWeb 服务端提供的用来建立与客户端会话状态的对象。

二、 Session 共享

什么是 Session 共享
是指在一个浏览器访问多个 Web 服务时,服务端的 Session 数据需要共享。

Session 共享应用场景
单点登录

Web 服务器集群等场景

Session 共享常见的解决方案
Session 复制
通过对应用服务器的配置开启服务器的 Session 复制功能,在集群中的几台服务器之间同步 Session 对象,使得每台服务器上都保存所有的 Session 信息,这样任何一台宕机都不会导致 Session 的数据丢失,服务器使用 Session 时,直接从本地获取。这种方式的缺点也比较明显。因为 Session 需要时时同步,并且同步过程是有应用服务器来完成,由此对服务器的性能损耗也比较大。
Session 绑定
利用 hash 算法,比如 nginx 的 ip_hash,使得同一个 Ip 的请求分发到同一台服务器上。 这种方式不符合对系统的高可用要求,因为一旦某台服务器宕机,那么该机器上的 Session 也就不复存在了,用户请求切换到其他机器后么有 Session,无法完成业务处理。
利用 Cookie 记录 Session
Session 记录在客户端,每次请求服务器的时候,将 Session 放在请求中发送给服务器, 服务器处理完请求后再将修改后的 Session 响应给客户端。这里的客户端就是 cookie。 利用 cookie 记录 Session 的也有缺点,比如受 cookie 大小的限制,能记录的信息有限, 安全性低,每次请求响应都需要传递 cookie,影响性能,如果用户关闭 cookie,访问就不正常。
Session 服务器
Session 服务器可以解决上面的所有的问题,利用独立部署的 Session 服务器统一管理 Session,服务器每次读写 Session 时,都访问 Session 服务器。 对于 Session 服务器,我们可以使用 Redis 或者 MongoDB 等内存数据库来保存 Session 中的数据,以此替换掉服务中的 HttpSession。达到 Session 共享的效果。

三、SpringSession的简介

Spring Session 是 Spring 的项目之一。Spring Session 提供了一套创建和管理 Servlet HttpSession 的方案,默认采用外置的 Redis 来存储 Session 数据,以此来解决 Session 共享的 问题。

四、 SpringSession 的使用

安装Redis单机版

点击查看单机版安装

共享简单数据

搭建案例环境
项目简单介绍,创建了一个父项目,两个聚合模块的子项目
父项目为pom项目
子项目为jar项目
1.创建父项目
创建项目 ,修改pom文件
注 :需要继承SpringBoot父项目的启动器,添加项目运行环境,相关的jar
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.7.RELEASE
ah.szxy.springsession
01-SpringSession
0.0.1-SNAPSHOT
pom
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.session
spring-session-core
org.springframework.boot
spring-boot-starter-test
test
org.springframework.session
spring-session-data-redis
io.lettuce
lettuce-core
org.springframework.boot
spring-boot-maven-plugin
/code>
br />
code class='prism'>
4.0.0
ah.szxy.springsession
01-SpringSession
0.0.1-SNAPSHOT
session_service1
/artifactId>
br />
properties>
1.8
3.1.1
/properties>
br />
br />
modelVersion>4.0.0
/modelVersion>
br />
parent>
org.springframework.boot
spring-boot-starter-parent
/artifactId>
br />
version>2.1.7.RELEASE
/version>
br />
relativePath />
ah.szxy.springSession
02-SpringSession-MongoDB
/artifactId>
br />
version>0.0.1-SNAPSHOT
/version>
br />
packaging>pom
/packaging>
br />
properties>
1.8
3.1.1
/properties>
br />
dependencies>
org.springframework.boot
spring-boot-starter-web
/dependency>
br />
dependency>
org.springframework.session
spring-session-core
/artifactId>
br />
br />
dependency>
org.springframework.session
spring-session-data-mongodb
/artifactId>
br />
br />
groupId>org.springframework.boot
/groupId>
br />
spring-boot-starter-data-mongodb
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
session_mongo2
2.创建两个子项目,无需修改pom文件
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">
4.0.0
ah.szxy.springSession
02-SpringSession-MongoDB
0.0.1-SNAPSHOT
session_mongo1
注意:两个pom文件除名称不一样外,其他一致
3.修改全局配置文件 application.yml
server:
port: 8081
spring:
application:
name: Session-Mongdb1
session:
store-type: mongodb
data: #配置MongoDB的连接参数
mongodb:
host: 192.168.179.131
port: 27017
database: chy #自定义MongoDB库名称注意:两个配置文件处理应用名,端口号不一样外,其他一致
4.启动类
package ah.szxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.mongo.config.annotation.web.http.EnableMongoHttpSession;
@SpringBootApplication
@EnableMongoHttpSession
public class SessionMongoApp {
public static void main(String[] args) {
SpringApplication.run(SessionMongoApp.class, args);
}
}注:两个启动类完全一致
4.session_mongo1的controller
@RestController
@RequestMapping("service1")
public class MongoDBController {
@RequestMapping("setMsg")
public String showMsg(HttpSession session) {
session.setAttribute("msg", "Hello MongoDB!!!");
return "ok";
}
}5.session_mongo2的controller
@RestController
@RequestMapping("service2")
public class MongoDBController {
@RequestMapping("getMsg")
public String showMsg(HttpSession session) {
String msg = (String) session.getAttribute("msg");
return msg;
}
}6.测试结果
启动两个项目, 访问session_mongo1的controller
访问session_mongo2的controller
共享自定义对象
1.两个子模块都要创建Users实体类
package ah.szxy.domain;
import java.io.Serializable;
public class Users implements Serializable{
private String username;
private String userpwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpwd() {
return userpwd;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
@Override
public String toString() {
return "Users [username=" + username + ", userpwd=" + userpwd + "]";
}
public Users() {
super();
}
public Users(String username, String userpwd) {
super();
this.username = username;
this.userpwd = userpwd;
}
}注意:勿忘实现序列化接口
2.session_mongo1的controller中添加方法
@RequestMapping("addUser")
public String showMsg(HttpSession session,Users user) {
session.setAttribute("user", user);
return "ok";
}3.session_mongo2的controller中添加方法
@RequestMapping("getUser")
public Users showUser(HttpSession session) {
Users user=(Users) session.getAttribute("user");
return user;
}4.测试结果
SpringSession MongoDB 的存储结构
使用其专用的查询语句即可查看它的存储结构
整理如下 点击使用json格式校验/转换
{
"_id": "138af2fe-cf3f-4e8d-8ea1-a311ecd70edc",
"created": ISODate("2019-09-16T08:42:51.767Z"),
"accessed": ISODate("2019-09-16T09:07:10.425Z"),
"interval": "PT30M",
"principal": null,
"expireAt": ISODate("2019-09-16T09:37:10.425Z"),
"attr": BinData(0, "rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAACdAADbXNndAAQSGVsbG8gTW9uZ29EQiEhIXQABHVzZXJzcgAUYWguc3p4eS5kb21haW4uVXNlcnOYj4Y/edg3CAIAAkwACHVzZXJuYW1ldAASTGphdmEvbGFuZy9TdHJpbmc7TAAHdXNlcnB3ZHEAfgAGeHB0AANjaHl0AAl0aW1lcGF1c2V4")
}设置session的失效时间
/** * @EnableMongoHttpSession * maxInactiveIntervalInSeconds: 设置超时时限, 两个子模块的这个属性必须一致 * collectionName: 可省略,唯一标识,使用时两个子模块的这个属性必须一致 */
@SpringBootApplication
@EnableMongoHttpSession(maxInactiveIntervalInSeconds=20,collectionName="test")
public class SessionMongoApp {
public static void main(String[] args) {
SpringApplication.run(SessionMongoApp.class, args);
}
}注意 : @EnableMongoHttpSession注解的两个属性的用法
@EnableMongoHttpSession 注解中相关属性讲解
| 属性 | 作用 |
| maxInactiveIntervalInSeconds | 设置 Session 失效时间 ,默认为2100s |
| collectionName | 设置 MongoDB 的 Collections 的名称 ,默认为seesions |
更换 SpringSession 的序列化器
默认使用的是jdk序列化器,序列化后产生的数据较大,占用内存较高,因此最好换成其他的序列化器
使用配置类修改序列化器
@Configuration
public class SerializableConfig {
@Bean
JacksonMongoSessionConverter mongoSessionConverter() {
return new JacksonMongoSessionConverter();
}
}启动项目时报错,因为json转换时对对象的属性做了校验,
而自定义对象的属性不在白名单中,我们需要关闭属性的自动校验。
在实体类上添加注解关闭自动校验
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
public class User implements Serializable {
private String username;
private String userpwd;
...
}mongodb中存储的数据
{
"_id" : "36d3dd35-e33d-49f8-bde9-ec3587e2d560",
"@class" : "org.springframework.session.data.mongo.MongoSession",
"createdMillis" : NumberLong(1566549133774),
"accessedMillis" : NumberLong(1566549137807),
"intervalSeconds" : 20,
"expireAt" : ISODate("2019-08-23T08:32:37.807Z"),
"attrs" : {
"@class" : "java.util.HashMap",
"user" : {
"@class" : "cn.xyl.pojo.User",
"_id" : 123,
"name" : "hello"
}
},
"principal" : null
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/114566.html