在平时开发中,往往会把一个项目部署在多个tomcat中,然后使用Nginx实现负载均衡,分发请求,将请求分发到不同的服务器中。由于session是在服务端创建的,第一次访问A服务器,那么session就会存在A服务器中,再次访问时由于负载均衡可能将请求分发到B服务器中,这时就获取不到之前的session信息了,所以需要实现session共享。
使用IDEA创建一个spring boot项目,导入maven依赖,spring boot版本2.1.4版本以上连接redis需要引入security部分的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
session共享需要借助redis,在application.properties中增加redis的配置信息:
server.port=8082
# redis基础配置
# redis数据库索引(默认0)
spring.redis.database=0
# redis服务器地址
spring.redis.host=127.0.0.1
# redis服务器连接端口
spring.redis.port=6379
# redis服务器连接密码(默认为空)
spring.redis.password=jinghx
# 连接超时时间 单位毫秒 ms
spring.redis.timeout=2000
由于项目中需要导入spring boot security的依赖,否则会报错,这里只是一个演示项目,security不是重点,禁用以后使用会方便些:
@SpringBootApplication
// 禁用Security
@EnableAutoConfiguration(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
})
public class SpringbootSessonApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootSessonApplication.class, args);
}
}
创建一个Controller方便演示:
@RestController
public class HelloController {
@Value("${server.port}")
Integer port;
@GetMapping("/login")
public String set(String name, HttpSession session) {
session.setAttribute("name", name);
return "欢迎" + name + "登录端口号为" + port + "的系统!";
}
@GetMapping("/hello")
public String get(HttpSession session) {
return "hello," + session.getAttribute("name") + "现在系统端口号:" + port;
}
}
将spring boot项目打包:
通过cmd命令行启动两个不同端口的项目:
java -jar springboot-sesson-0.0.1-SNAPSHOT.jar --server.port=8081
java -jar springboot-sesson-0.0.1-SNAPSHOT.jar
由于我们需要使用Nginx实现负载均衡,所以这里简单介绍一下Nginx的安装与配置:
1.从官网下载:http://nginx.org/en/download.html
2.解压,启动Nginx:
3.验证Nginx是否安装成功,输入http://localhost:80
4.修改配置文件:
upstream nginxtest{
# 代理IP
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / { # / 表示拦截所有
proxy_pass http://nginxtest; # 所有请求转发到http://nginxtest;
#root html;
#index index.html index.htm;
}
5.重启Nginx:
nginx.exe -s reload
Nginx安装配置好后,即可访问:http://localhost/login?name=张三,将name为“张三”设置到session中
然后访问:http://localhost/hello,多次刷新
可看到在不同的系统中都可以从session中获取name属性,值为“张三”,至此一个简单的session共享项目已经实现了。