目录
一、Session共享介绍
1.什么是Session
对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap;
2.什么是Session共享
部署多台服务, 确保每个服务都能共享到同一份Session数据.就是Session共享
3.为什么要实现Session共享
在单机环境中,Session的创建和存储都是由同一个应用服务器实例来完成,而存储也仅是内存中,最多会在正常的停止服务器的时候,把当前活动的Session钝化到本地,再次启动时重新加载。
而分布式系统中多个应用之间,Session数据是完全隔离的。而为了实现Session的高可用,多实例间数据共享是必然的,所以我们需要用到Session共享。
二、Session共享的简单实现
要在SpringBoot中实现Redis共享只需要下面前三步即可
1 配置pom.xml文件
<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>
2 配置Redis数据源
spring.redis.host=123.207.231.159
spring.redis.port=6379
spring.redis.password=root
spring.redis.database=1
3 启动类添加注解
消费者和提供者在启动类分别添加注解@EnableRedisHttpSession这里maxInactiveIntervalInSeconds是设置的超时时间单位秒,默认30分钟
@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 10*60)
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
4 测试
1)提供者控制器
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class ShareSession {
@RequestMapping("/session/set")
public String setSession(HttpServletRequest servletRequest){
servletRequest.getSession().setAttribute("zzx","qq");
return "success";
}
}
2)消费者控制器
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class ShareSession {
@RequestMapping("/session/get")
public String setSession(HttpServletRequest servletRequest){
return String.valueOf(servletRequest.getSession().getAttribute("zzx"));
}
}
3)浏览器分别访问提供者和消费者接口
这里,提供者应用的端口是8762,消费者应用的端口是8763。这样我们就简单的实现了基于Redis的Session共享。