一、SpringSession快速入门
创建两个SpringBoot工程,分别用来测试添加和获取session
1. 依赖
需要有 web-starter ,redis-starter,springSession-starter
<!-- springboot整合redis依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot整合SpringSession依赖-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2. 添加主启动类
3. 编写application.yaml配置文件
两个工程都需要编写
server:
port: 8222
#redis配置
spring:
redis:
host: 192.168.10.11
jedis:
pool:
max-idle: 100
#spring session 配置一下使用哪个数据库存储session
session:
store-type: redis
4. 测试
a工程,往session里存一个值后,b工程就可以获取到
- a工程是存储到了redis中,b工程也是从redis中获取的
- 使用完全无感觉,不需要添加什么什么注解【非侵入式】
二、SpringSession基本原理
概括:SpringSession 从底层全方位“接管”了 Tomcat 对 Session 的管理
- 利 用 Filter 原 理 , 在 每 次 请 求 到 达 目 标 方 法 之 前 , 将 原 生 HttpServletRequest/HttpServletResponse 对 象 包 装 为 SessionRepositoryRequest/ResponseWrapper。
- 包装 request 对象时要做到:包装后和包装前类型兼容。所谓类型兼容:“包装得到的 对象 instanceof 包装前类型”返回 true。
- 只有做到了类型的兼容,后面使用包装过的对象才能够保持使用方法不变。包装过的对 象类型兼容、使用方法不变,才能实现“偷梁换柱”。
- 但是如果直接实现 HttpServletRequest 接口,我们又不知道如何实现各个抽象方法。这 个问题可以借助原始被包装的对象来解决。