( 十一 )、 SpringBoot整合SpringSession实现Session共享

 ( 十一 )、 SpringBoot整合SpringSession实现Session共享

 

 

 

官网:  

github:  https://github.com/spring-projects/spring-session

Spring: https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot-redis.html

 

1、简介

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

我们都知道session是存储在Tomcat服务器中的内存中的,当有多台机器时,当用户登录时,只在一台机器上存在session信息,那么用户访问到另外一台机器的时候,就没办法获取到用户信息,这个时候Session 服务器可以解决上面的问题,利用独立部署的 Session 服务器统一管理 Session,服务器每次读写 Session 时,都访问 Session 服务器。 对于 Session 服务器,我们可以使用 Redis 或者 MongoDB 等内存数据库来保存 Session 中的数据,以此替换掉服务中的 HttpSession。达到 Session 共享的效果。

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

 

2、使用:

1:安装redis:    https://www.cnblogs.com/dw3306/p/9517716.html

2: 引入项目依赖

          <!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- spring-session-data-redis-->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

3、修改Yml:

server:
  port: 8081
  servlet:
    context-path: '/'

spring:
  session:
    # 会话存储类型。
    store-type: redis
    redis:
      #  flush-mode: 两种刷新模式,默认是:on_save, 1: on_save 只有当 SessionRepository.save(Session)方法被调用时,才会将session中的数据同步到redis中。
      #在web 应用中,当请求完成响应后,才开始同步。也就是说在执行response 之前session数据都是缓存在本地的
      # 2: IMMEDIATE:实时同步session 数据到redis。当执行 SessionRepository.createSession()时, 会将session数据同步到redis中;
      #当对session的attribute进行set/remove 等操作时,也会同步session中的数据到redis中。
      flush-mode: on_save
      # Namespace for keys used to store sessions.
      namespace: spring:session
      # 配置session过期时间
    timeout: 30m
  # redis 配置
  redis:
    host: 192.168.248.130
    port: 6379
    password: 123456
    database: 0
    # redis连接超时时间
    timeout: 30s

4、测试:

1、创建一个Controller设置session

@RestController
@RequestMapping("service1")
public class WebController {

    @RequestMapping("/setMsg")
    public String setMsg(HttpSession session, String msg){
        session.setAttribute("msg",msg);
        return "ok";
    }
}

2、创建另一个服务取session

@RestController
@RequestMapping("service2")
public class WebController {

    @RequestMapping("/getMsg")
    public String getMsg(HttpSession session){
        String msg = (String) session.getAttribute("msg");
        return msg;
    }
}

 

其他:

上面是使用yml配置开启springSession,也可使用注解配置 @EnableRedisHttpSession(maxInactiveIntervalInSeconds=20)

 

 3、不同子域名共享

<!--配置一个Cookie序列化规则对象 用于改变Cookie的存放规则 -->
    <bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer">
        <!--指定SpringSession的SessionId存放在域名的根路径下,用于实现同域名不同项目的Session共享 -->
        <property name="cookiePath" value="/" />
        <!--指定SpringSession的SessionId存放在根域名下,用于实现同根域名不同二级子域名下的Session共享
            适合应用在Nginx的虚拟主机的多城市站点部署
         -->
        <property name="domainName" value="myweb.com"/>
    </bean>

 

 

 

源码地址: https://github.com/dengwei-java/springBoot-springSession

 

posted @ 2021-01-16 21:25  邓维-java  阅读(910)  评论(0编辑  收藏  举报