JavaWeb 之分布式Session共享

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(一)揭秘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值