zoukankan      html  css  js  c++  java
  • 集群session解决方案

    集群状态下的session解决方法

    在集群的环境下,请求可能会被转发到不同的服务器上去处理,这样会导致,在服务器A上等以后,处理其他任务时被分配到服务器B上,此时服务器A上session不存在在服务器B上,会让用户重新登录,这样的体验用户肯定不能接受。

    解决方案

    1. session复制(如果集群环境过大,也不推荐)
    2. session共享
    3. 保存在cookie中(不推荐)

    本次使用session共享的方式解决

    • 测试环境:spring boot +redis
    • 测试工具 chrome浏览器
    • 开发工具 idea
    • 项目构建工具maven

     

    1:首先创建springboot项目

        

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--spring session 核心依赖-->
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-core</artifactId>
            </dependency>
            <!--spring session 操作redis依赖-->
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    @GetMapping("/get")
        public String index(HttpServletRequest request) {
            Object name = request.getSession().getAttribute("name");
            return name != null ? "success" : "false";
        }
    
        @GetMapping("/set")
        public String index(HttpServletRequest request,HttpServletResponse response){
            Object name = request.getSession().getAttribute("name");
            if (null==name)
                request.getSession().setAttribute("name", "zs");
            return "set success";
        }

    运行了两个springboot项目,一个在端口8080,一个在端口8081,模拟集群环境

     8080,8081两个端口的项目访问都是false,说明此时没有session

     此时手动设置一个session值后,再次访问get,返回success

     访问8081端口的项目

     返回success,说明成功获取到session

    redis中存在刚才存入的session值,说明集群获取session成功。

      

  • 相关阅读:
    Haproxy 【转载】
    Nginx介绍
    Day 13 进程和线程
    运维第一课
    面试bb
    Day 12 字符串和正则表达式
    Day 11 文件和异常
    Day10 图形用户界面和游戏开发
    Day9 面向对象进阶
    day8 面向对象编程基础
  • 原文地址:https://www.cnblogs.com/yjp372928571/p/12667519.html
Copyright © 2011-2022 走看看