集群状态下的session解决方法
在集群的环境下,请求可能会被转发到不同的服务器上去处理,这样会导致,在服务器A上等以后,处理其他任务时被分配到服务器B上,此时服务器A上session不存在在服务器B上,会让用户重新登录,这样的体验用户肯定不能接受。
解决方案
- session复制(如果集群环境过大,也不推荐)
- session共享
- 保存在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成功。