Session 共享实现

为什么要实现session共享呢

  • 随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题:

  • 当用户进行一个session会话的时候,比如一个用户去登录项目,一般的大公司的项目都是有Nginx进行反向代理的,但是这里简单列举一下Nginx常用的几种反向代理策略:1.轮询策略,2. 权重比例策略,3. ip_hash策略,4.fair策略,5. 还可以自定义的策略,在Nginx的反向代理下,一般会把用户的请求分发到不同的服务器上,但是如果用户请求的请求是存放在该请求的服务器A上,那么该用户的sessionID就存储在该服务器上JVM的一个ConcurrentHashmap中,以sessionID为key。

  • 但是如果此时用户请求的一个服务模块可能需要调用到服务器B,当用户发起请求的时候,此时的服务器B上并没有存储该用户的sessionID,所以就会再次让用户进行一个登陆操作。还有可能会导致用户本来就想完成一个下单操作,但是却还登陆了好几次的情况。

  • 所以session共享方案在分布式环境和微服务系统下,显得尤其重要。

 

实现session共享的几种方式:

  1. 基于Nginx的ip_hash 负载均衡

  2. 基于Tomcat的session复制

  3. session放到cookie中去

  4. 使用Redis做缓存session的统一缓存

 

使用Redis做缓存session的统一缓存

本次主要实现的是第四种方式的实现(使用Redis做缓存session的统一缓存)

  1. 步骤: 在项目中导入Redis和Session-Redis依赖

    <!--SpringBoot整合redis依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <version>2.6.4</version>
    </dependency><!--Redis整合session依赖,引入后会自动将 session 存储到 redis 中-->
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
        <version>2.6.3</version>
    </dependency>

     

    注意:引入redis和spring-redis依赖版本需要接近

     

  2. 在application.xml里配置Redis和session

    spring:
      #session
      session:
        #session失效时间
        timeout: 86400
        #默认是none,表示存储在单台服务器
        store-type: redis   #表示从redis中读写session(关键)
      #redis
      redis:
        port: 6379
        host: xxx.xxx.xxx.xxx
        password: xxxxxx
        database: 0

    关键:store-type: redis,只要配置了这个,那么代码中session就会存放到redis中而不是自己的内存中

 

测试

后端session存入redis

    @Override
    public User userLogin(String userAccount, String userPassword, HttpServletRequest request) {
        //1.校验
        //账号不能包含特殊字符
        
        //2.加密
        //查询账户是否存在
        
        //用户不存在
        //3.用户信息脱敏
//4.记录用户的登录态
        request.getSession().setAttribute(USER_LOGIN_STATE,safetyUser);
        return safetyUser;
    }

 

向后端发送登录请求

 

 

验证redis中session是否存在

 

 

验证成功

 

转载至

https://blog.csdn.net/qq_43842093/article/details/120836732?ops_request_misc=&request_id=&biz_id=102&utm_term=Session%E5%85%B1%E4%BA%AB%E5%AE%9E%E7%8E%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-120836732.142^v56^js_top,201^v3^control_1&spm=1018.2226.3001.4187

https://blog.csdn.net/YXXXYX/article/details/125342292?ops_request_misc=&request_id=&biz_id=102&utm_term=Session%E5%85%B1%E4%BA%AB%E5%AE%9E%E7%8E%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-125342292.142^v56^js_top,201^v3^control_1&spm=1018.2226.3001.4187

原文地址:http://www.cnblogs.com/galo/p/16796115.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性