Session共享:就是当分布式部署的时候,不同服务器之间出现Session不共享的情况的解决办法
目前实现session共享的方法:
1: 可以使用nginx中的设置也可以实现session共享,在nginx有负载均衡的情况下配置ip_hash;就可以实现客户端永远连接到一个服务器,但是就失去了集群的作用了
2: 就是将sessionid和session都存到数据库中,每次去从数据库里面拿,这样的话还要去写sql,增加了服务器和数据库的压力
3: 另外可以将session采用cookie的形式存在本地,不安全
***4:就是采用redis实现session共享
采用springboot框架进行搭建 这样的好处的redis访问起来快,然后每个系统后台都是连接到redis的 首先在pom中引入spring-session包和redis连接包
<!--spring boot 与redis应用基本环境配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
<!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
spring-boot配置文件:
server:
port: 8081 #8080切换启动两次
然后新建两个类,一个配置redis连接,另外一个初始化session的配置 配置redis连接的类 : SessionConfig
//这个类用配置redis服务器的连接
//maxInactiveIntervalInSeconds为SpringSession的过期时间(单位:秒)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {
// 冒号后的值为没有配置文件时,制动装载的默认值
@Value("${redis.hostname:localhost}")
String HostName;
@Value("${redis.port:6379}")
int Port;
@Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connection = new JedisConnectionFactory();
connection.setPort(Port);
connection.setHostName(HostName);
return connection;
}
}
配置初始化session的类 : SessionInitializer
//初始化Session配置
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer {
public SessionInitializer() {
super(SessionConfig.class);
}
}
在这里进行简单的测试类:IndexController
@RestController
public class IndexController {
@Value("${server.port}")
private String port;
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request, String key, String value) {
HttpSession session = request.getSession();
session.setAttribute(key, value);
return "server---port:" + port + ",success";
}
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request, String key) {
HttpSession session = null;
try {
session = request.getSession(false);
} catch (Exception e) {
// TODO: handle exception
}
String value = null;
if (session != null) {
value = (String) session.getAttribute(key);
}
return "server---port:" + port + " value:" + value;
}
}
启动类App
@ComponentScan(basePackages="per.lx")
@EnableAutoConfiguration
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
这里需要本地启动redis和nginx 在nginx中实现负载均衡到8080和8081端口
请求nginx的servername地址/index访问成功则环境搭建成功
然后请求:地址:8080/setSession?key=lx&value=123456789 会提示在哪个端口的服务器保存session成功
然后请求:地址:8081/getSession?key=lx 在两台上面都能获取到session的值则证明session共享成功