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连接包
org.springframework.boot spring-boot-starter-redis org.springframework.session spring-session-data-redis
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
@RestControllerpublic 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")@EnableAutoConfigurationpublic 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共享成功