( 十一 )、 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:
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