文章16 | 阅读 8694 | 点赞0
通常情况下,Tomcat、Jetty等Servlet容器,会默认将Session保存在内存中。但是我们的session只能作用于当前容器中,其他不同端口的容器并不能使用同一个session,越来越多的应用采用分布式部署,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享?
本文基于redis实现session在不同服务器之间的共享问题!
首先我们先通过两个应用来体验一下不同服务器之间session的情况!
1.新建两个项目:springboot-redis-session、springboot-redis-session1,除了端口不一样其他的都写成一样,pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.在application.properties配置文件中分别配置两个项目的端口为8081、8082
@RestController
public class UserController {
@RequestMapping(value = "/index")
public String index(HttpServletRequest request) {
String msg = "欢迎进入主页";
Object user = request.getSession().getAttribute("user");
if (user == null) {
msg = "未登录!";
}
return msg;
}
@RequestMapping(value = "/login")
public String login(HttpServletRequest request, String userName, String password) {
String msg = "logon failure!";
request.getSession().setAttribute("user", "admin");
msg = "登陆成功!";
return msg;
}
@RequestMapping(value = "/loginout")
public String loginout(HttpServletRequest request) {
request.getSession().removeAttribute("user");
return "退出成功!";
}
}
注:两个项目这些都是一样的哦。只有端口不一样
分别启动两个项目。访问端口为8081的项目的 登陆方法时我们会在session中设置一个参数,访问8081主页时我们判断session的值是否存在,然后给出相应的提示。这里的提示为欢迎进入主页
接着我们访问端口为8082的项目的主页,你会发现提示未登录。这就是我们不同服务起之间的sesion是不能共享的原因!
打开两个项目的pom.xml文件,加入redis和session依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
注:加入redis得这两依赖包,你的保证在application.properties有配置能能访问得redis连接哦!不然就算你只加入这两个包其他的手 都没做。启动时候也会报错的哦!
配置application.properties,这里两个项目中都要加入相同的redis配置
# REDIS
# 连接工厂使用的数据库索引。
spring.redis.database=0
# IP地址
spring.redis.host=10.24.247.23
# 端口
spring.redis.port=6379
# 密码
spring.redis.password=123456
在两个想怎么样编写配置类:SessionConfig.java,没错就是这么简单
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {
}
注:maxInactiveIntervalInSeconds 默认是1800秒过期
重启两个项目。访问端口为8081的项目的登陆方法时我们会在session中设置一个参数,访问8081主页时我们判断session的值是否存在,然后给出相应的提示。这里的提示为欢迎进入主页
接着我们访问端口为8082的项目的主页,你会发现提示欢迎进入主页。成功的实现了session共享!
源码地址: https://gitee.com/xu0123/springboot2
redis安装地址: https://blog.csdn.net/xu12387/article/details/85003227
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/xu12387/article/details/88872229
内容来源于网络,如有侵权,请联系作者删除!