文章目录
Session 原理
分布式下Session共享问题
1、集群模式下Session共享问题
2、不同域名Session共享问题
Session共享问题解决-统一存储
Session共享问题解决-不同服务,子域session共享
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
// 将cookie设成主域名访问,确保不同域之间都能获取到该cookie的值,从而确保session统一
cookieSerializer.setDomainName("gulimall.com");
cookieSerializer.setCookieName("GULISESSION");
// 设置 cookie 在客户端保存时间为 3600 秒
cookieSerializer.setCookieMaxAge(3600);
return cookieSerializer;
}
Spring-Session 快速入门
Spring Session 就是使用 Spring 中的代理过滤器,将所有的 Session 操作拦截下来,自动的将数据同步到 Redis 中,或者自动的从 Redis 中读取数据。
对于开发者来说,所有关于 Session 同步的操作都是透明的,开发者使用 Spring Session,一旦配置完成后,具体的用法就像使用一个普通的 Session 一样。
1、引入redis和spring-session依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2、配置文件
启动类添加:@EnableRedisHttpSession
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.session.store-type=redis
server.servlet.session.timeout=30m
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;
@Configuration
public class SessionConfig {
// 设置session默认域名,解决不同域名共享session问题
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
cookieSerializer.setDomainName("gulimall.com");
cookieSerializer.setCookieName("GULISESSION");
return cookieSerializer;
}
// 使用Json方式进行序列化对象
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}
3、使用HttpSession
配置完成后 ,使用 Spring Session 和使用普通的 HttpSession 是一样的,框架已经自动帮你完成 Session 同步到 Redis 等操作了。
@GetMapping("set")
public String set(HttpSession session){
session.setAttribute("name", "James");
return "set";
}
@GetMapping("get")
public String get(HttpSession session){
String value = session.getAttribute("name") + "";
return value;
}
4、测试
打包之后,启动项目的两个实例:
java -jar xxx.jar --server.port=8080
java -jar xxx.jar --server.port=8081
在8080实例上向session中保存一个变量。
在8081实例上可以获取到在8080实例保存的session变量值,实现了session的同步。
数据就已经自动同步到 Redis 中了。
spring-session 核心原理
/**
* 核心原理
* 1)@EnableRedisHttpSession导入RedisHttpSessionConfiguration配置
* 1 给容器中添加了一个组件
* SessonReppository >>> RedisOperationSessionRepository,redis操作session的增删改查
* 2 SessionRepositoryFilter >> Filter: session存储过滤器,每个请求过来都必须经过filter
* 1.创建的时候,就自动从容器中获取到了SessionRepository;
* 2.原始的request,response都被包装了。SessionRepositoryRequestWrapper,SessionRepositoryWrapper;
* 3.以后获取session。request.getSession();
* 4.wrapperRequest.getSession();===>SessionRepository中获取到的。
*/
参考:
Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了!
SpringBoot+SpringSession+Redis实现session共享及单点登录
spring-session(一)揭秘