前言:我们知道,在单体项目中,我们将用户信息存在 session 中,那么在该 session 过期之前,我们都可以从 session 中获取到用户信息,通过登录拦截,进行操作 但是分布式部署的时候,我们请求的服务器可能不是同一台服务器,那么我们就必须要面对 session 共享的问题,下面介绍的是在 SpringBoot 实现 session 共享的方式
创建 SpringBoot 项目,选择 Maven 依赖
最终 pom.xml 文件如下:
<!-- redis的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- web的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- session共享的依赖 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
我们需要借助 redis 实现 session 共享,所以我们需要在配置文件中配置 redis 的信息
server:
port: 8080
spring:
redis:
host: 127.0.0.1
port: 6379
database: 0
password:
我们配置了该项目的端口,以及 redis 的连接信息
package com.zyxx.session.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController
public class DemoController {
/**
* 获取项目端口
*/
@Value("${server.port}")
private String port;
/**
* 将信息存放在session中
*/
@GetMapping("set")
public String set(HttpSession session) {
session.setAttribute("user", "hello world~~~");
return port;
}
/**
* 从session中获取信息
*/
@GetMapping("get")
public String get(HttpSession session) {
return session.getAttribute("user") + " : " + port;
}
}
启动项目,分别启动在两个端口:
java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8081
我们在 8081 端口的项目中从 session 中取出了内容:hello world~~~
由此证明,我们的 session 共享已经成功。
下面我们借助 nginx 代理转发访问这两个项目
nginx 配置文件如下:
主要配置内容:
upstream helloworld{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
这里配置转发到 8080,8081 端口,并配置了权重
location / {
proxy_pass http://helloworld;
#root html;
#index index.html index.htm;
}
拦截本地的所有请求,默认端口为 80
我们先删除 redis 里面刚刚测试保存的信息
然后我们访问: http://localhost/set 这里我们可以看出,由 8080 端口的服务器完成了 set 请求,多次访问,nginx 将会根据什么配置的权重参数分配服务器来完成操作
下面我们访问: 可以看出,由 8081 端口的服务器完成了 get 请求,并成功取到了存在 session 中的数据,实现了 session 共享
1、以前我们在 SSM 架构的项目中实现 session 共享,需要配置三个地方 ,一个是 web.xml 配置代理过滤器,然后在 Spring 容器中配置 Redis,最后再配置 Spring Session,相比 SpringBoot,稍有复杂 2、我们在 SpringBoot 中实现 session 共享还是非常简单的,只需要引入依赖,简单配置即可实现 3、实现 session 共享,帮助我们将项目分布式部署,提升服务性能有很大的意义