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共享成功