集群状态下的session解决方法
在集群的环境下,请求可能会被转发到不同的服务器上去处理,这样会导致,在服务器A上等以后,处理其他任务时被分配到服务器B上,此时服务器A上session不存在在服务器B上,会让用户重新登录,这样的体验用户肯定不能接受。
解决方案
session复制(如果集群环境过大,也不推荐)
session共享
保存在cookie中(不推荐)
本次使用session共享的方式解决
测试环境:spring boot +redis
测试工具 chrome浏览器
开发工具 idea
项目构建工具maven
1:首先创建springboot项目
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-web
org.springframework.session
spring-session-core
org.springframework.session
spring-session-data-redis
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
@GetMapping("/get")publicString index(HttpServletRequest request) {
Object name= request.getSession().getAttribute("name");return name != null ? "success" : "false";
}
@GetMapping("/set")publicString 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成功。