spring boot学习笔记之简单实现session共享

在平时开发中,往往会把一个项目部署在多个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共享项目已经实现了。

一颗安安静静的小韭菜。文中如果有什么错误,欢迎指出。
原文地址:https://www.cnblogs.com/c-Ajing/p/13448359.html