一、SpringSession快速入门

创建两个SpringBoot工程,分别用来测试添加和获取session

1. 依赖

需要有 web-starter ,redis-starter,springSession-starter

  1. <!-- springboot整合redis依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <!--web依赖-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. <!-- springboot整合SpringSession依赖-->
  12. <dependency>
  13. <groupId>org.springframework.session</groupId>
  14. <artifactId>spring-session-data-redis</artifactId>
  15. </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 的管理
未命名图片.png

  • 利 用 Filter 原 理 , 在 每 次 请 求 到 达 目 标 方 法 之 前 , 将 原 生 HttpServletRequest/HttpServletResponse 对 象 包 装 为 SessionRepositoryRequest/ResponseWrapper。
  • 包装 request 对象时要做到:包装后和包装前类型兼容。所谓类型兼容:“包装得到的 对象 instanceof 包装前类型”返回 true。
  • 只有做到了类型的兼容,后面使用包装过的对象才能够保持使用方法不变。包装过的对 象类型兼容、使用方法不变,才能实现“偷梁换柱”。
  • 但是如果直接实现 HttpServletRequest 接口,我们又不知道如何实现各个抽象方法。这 个问题可以借助原始被包装的对象来解决。