分布式session不共享不同步问题

session共享问题:

session原理:

存在的问题:

1、不同服务,不能跨不同域名进行共享,

2、同一个服务,复制多分,session不能同步的问题

解决方案的原理:

针对问题2:

可以采用session复制(同步)方案

优点:web-server原生支持,只需要修改配置文件

缺点:

1、session同步需要数据传输,占用大量网络带宽,降低了服务器群的业务处理能力

2、任意一台web-server保存的数据都是所有web-server的session综合,受到内存限制无法水平扩展更多web-server

3、大型分布式集群的情况下,由于所欲web-server都全量保存数据,所以此方案不可取

客户端存储:

优点:服务器不需要存session,用户保存自己的session信息到cookie中,节省服务端资源

缺点:(都是缺点,这只是一种思路)

1、每次HTTP请求,携带用户在cookie中的完整信息,浪费网络带宽

2、session数据放在cookie中,cookie长度有限制4K,不能保存大量信息

3、session数据保存在cookie中,存在泄露,篡改,窃取等安全隐患

这种方式不会使用!!!

hash一致性:

统一存储:

 

针对问题1:

Spring Session的整合:

1,引入依赖

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

2,在主类上添加@EnableRedisHttpSession注解

3,需要解决两个问题:

     1、默认发的令牌 修改作用域 (解决子域session共享问题)

     2、使用JSON的序列化方式来序列化对象

@Configuration
public class GreymallSessionConfig {

    @Bean
    public CookieSerializer cookieSerializer(){
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        cookieSerializer.setDomainName("greymall.com");
        cookieSerializer.setCookieName("GREY_SESSION");

        return cookieSerializer;
    }

    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
}

Spring Session的原理:

1,@EnableRedisHttpSession导入了RedisHttpSessionConfiguration配置

      1,给容器中添加了一个组件:sessionRepository===》RedisOperationsSessionRepository,redis操作session的的增删改查的封装类

      2、sessionRepositoryFileter==》Fileter:session存储过滤器,每个请求过来都必须经过fileter

            1、创建的时候就自动从容器中获取sessionRepository

            2、原始的request和response都被包装

            3、以后获取session,request.get()

            4、wrappedRequest.getSession();===>SessionRepository中获取到的

            主要采用了包装者模式

sessionRepositoryFileter

 

 

 
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页