SpringSession 实例

官方文档:

https://spring.io/projects/spring-session

一.Spring Session简介

1. Spring Session概念:

Spring Session 是Spring家族中的一个子项目,Spring Session提供了用于管理用户会话信息的API和实现。

它把servlet容器实现的httpSession替换为spring-session,专注于解决 session管理问题,Session信息存储在Redis中,可简单快速且无缝的集成到我们的应用中

2. Spring Session的特性:

Spring Session使支持集群会话变得很简单,而无需绑定到特定于应用程序容器的解决方案。它还提供与以下内容的透明集成:

HttpSession -允许以应用程序容器(即Tomcat)中立的方式替换HttpSession,并支持在标头中提供会话ID以与RESTful API一起使用

WebSocket -提供了在接收WebSocket消息时使HttpSession保持活动状态的功能

WebSession -允许以应用程序容器中立的方式替换Spring WebFlux的WebSession

3. Session会话共享方案

第一种是使用容器扩展插件来实现,比如基于Tomcat的tomcat-redis-session-manager插件,基于Jetty的jetty-session-redis插件、memcached-session-manager插件;这个方案的好处是对项目来说是透明的,无需改动代码,但是由于过于依赖容器,一旦容器升级或者更换意味着又得重新配置

第二种是 使用Nginx负载均衡的ip_hash策略实现用户每次访问都绑定到同一台具体的后台tomcat服务器实现session总是存在

第三种是自己写一套Session会话管理的工具类,在需要使用会话的时候都从自己的工具类中获取,而工具类后端存储可以放到Redis中,这个方案灵活性很好,但开发需要一些额外的时间

第四种是使用框架的会话管理工具,也就是本文所使用的Spring session,这个方案既不依赖tomcat容器,又不需要改动代码,由Spring session框架为我们提供,可以说是目前非常完美的session共享解决方案

4.spring-session分为以下核心模块:

SessionRepositoryFilter:Servlet规范中Filter的实现,用来切换HttpSession至Spring Session,包装HttpServletRequest和HttpServletResponse

HttpServerletRequest/HttpServletResponse/HttpSessionWrapper包装器:包装原有的HttpServletRequest、HttpServletResponse和Spring Session,实现切换Session和透明继承HttpSession的关键之所在

Session:Spring Session模块

SessionRepository:管理Spring Session的模块

HttpSessionStrategy:映射HttpRequst和HttpResponse到Session的策略

二.Spring Session示例

1.在idea中 新建两个 springboot 项目

springsession01 和 springsession02

2. 导入依赖

<-- 父依赖 -->

 <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.3.1.RELEASE</version>
 </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 引入 springboot&redis 整合场景 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- 引入 springboot&springsession 整合场景 -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
</dependencies>

     3. 分别写两个项目(springsession01 和 springsession02)的主启动类

     4.在springsession01 中 写 TestController  

设置session

package com.crowd.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;

@RestController
public class TestController {
    @RequestMapping("/test/spring/session/save")

    public String testSession(HttpSession session){
        session.setAttribute("name","hjj");
        return "测试 session 共享";
    }
}

5.在springsession02 中 获取session中的

@RestController
public
class TestController { @RequestMapping("/test/spring/session/retrieve") public String testSession(HttpSession session){ String name = (String) session.getAttribute("name"); return name; } }

6. 配置 application.yml   

springsession01中:

spring:
  redis:
    host: 192.168.4.253
    port: 6379
    password: admin
    jedis:
      pool:
        max-idle: 100

  session:
    store-type: redis
server:
  port: 8081

springsession02中:

spring:
  redis:
    host: 192.168.4.253
    port: 6379
    password: admin
    jedis:
      pool:
        max-idle: 100

  session:
    store-type: redis
server:
  port: 8082

 7. 分别启动两个 项目 测试

http://localhost:8081/test/spring/session/save

 http://localhost:8383/test/spring/session/retrieve

转自:https://blog.csdn.net/weixin_51364443/article/details/117335380

原文地址:https://www.cnblogs.com/xiaoliu66007/p/15319282.html