集群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成功。

  

猜你喜欢

转载自www.cnblogs.com/yjp372928571/p/12667519.html