springboot(十五)redis实现分布式session共享

x33g5p2x  于2021-12-17 转载在 其他  
字(2.7k)|赞(0)|评价(0)|浏览(556)

前言:

     通常情况下,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

  1. 新建测试类UserController.java,我们通过一个登陆登出的场景体验
@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是不能共享的原因!

实现session共享:

 打开两个项目的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

相关文章