目录
一、单机登录思路
二、修改为分布式登录的原理和思路
1. 单机登录的局限性
2. 解决方案:共享存储
三、使用 Redis 实现分布式登录
1. 本地安装 Redis 后启动 Redis
2. 引入 Redis 依赖
3. 在 application.yml 中配置 Redis 账户和密码
4. Redis 本地可视化管理工具:Another Redis Desktop
5. 使用 Redis 存储 Session
四、测试分布式登录:共享 Session
一、单机登录思路
1. 用户发送登录请求
2. 服务端验证登录用户信息,校验通过设置 Cookie 响应给前端
3. 后续用户每次发送请求都会携带 Cookie
4. 服务端收到请求时校验 Cookie 中的 Session / JSESSIONID,在服务端(Tomcat)中查找 Cookie 信息
- 找到说明该用户已经登录过,通过校验,响应请求
- 未找到说明该用户未登录,请求失败
案例分析:为什么用户在服务器 A 登录后,向服务器 B 发送请求,B 不认识该用户?
- 用户在 A 登录,session 用户登录态存在 A 上面,B 上面没有用户的登录信息
- 第二次请求落到 B 上,B 找不到该用户的登录记录,所以请求失败
二、修改为分布式登录的原理和思路
1. 单机登录的局限性
- Session 信息保存在服务器上,多台 Tomcat 不共享 Session 的存储空间,当集群模式下请求切换到不同的 Tomcat 服务器上,出现数据丢失的问题
2. 解决方案:共享存储
- 将共享数据(登录态)存储到所有服务器都能查询的地方,而不是存到单台服务器上
-
✔Redis(基于内存的 K - V 数据库)
-
需要高频判断用户登录态
-
需要高频读取用户信息
-
Redis 读写性能高
-
3. 本地模拟集群
- 在多个端口运行后端服务:IDEA 在本地启动多个 SpringBoot 后端服务模拟集群-CSDN博客
- 同一个用户发送请求到不同的服务端时,验证是否能通过校验
4. 修改种 Session 的机制
- 发现问题:在 8080、8081 启动服务后,使用 Knife4j 接口文档进行测试,服务器会为同一个域名下的不同端口生成不同的 Session
- 解决:修改 Cookie 的范围,让同一个域名下的多个端口都共享同一个 Cookie,如 domain: localhost 让域名为 localhost 的请求都共享同一个 Cookie
server:
reactive:
session:
cookie:
domain: localhost
三、使用 Redis 实现分布式登录
1. 本地安装 Redis 后启动 Redis
Redis 5.0.14 下载:
链接:https://pan.baidu.com/s/1XcsAIrdeesQAyQU2lE3cOg
提取码:vkoi
- 进入 Redis 安装目录,输入启动命令
D:\tools\Redis-x64-3.2.100>redis-server.exe redis.windows.conf
[33684] 17 Jan 11:22:25.795 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
D:\tools\Redis-x64-3.2.100>redis-cli.exe
127.0.0.1:6379> shutdown
not connected> exit
D:\tools\Redis-x64-3.2.100>redis-server.exe redis.windows.conf
- 启动 Redis,显示启动端口号 6379
2. 引入 Redis 依赖
- 引入 Spring Boot Starter Data Redis 会自动整合 SpringBoot 和 Redis
❗注意:引入的版本要和 SpringBoot 的版本一致
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.7.17</version>
</dependency>
3. 在 application.yml 中配置 Redis 账户和密码
spring:
redis:
host: 127.0.0.1
port: 6379
password: root@csu
database: 0
4. Redis 本地可视化管理工具:Another Redis Desktop
- 连接报错:Stream On Error: NOAUTH Authentication required.
- 解决方法:填连接密码,不填用户名
- 连接成功
5. 使用 Redis 存储 Session
- 引入 Spring Session Data Redis:自动将 Session 存入 Redis 数据库中
❗注意:引入的版本要和 SpringBoot 的版本一致
<!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.7.0</version>
</dependency>
- 在 application.yml 中添加 Session 的 Redis 配置
- store-type:默认是 none,表示存储在服务器,修改为 redis
session:
timeout: 86400
store-type: redis
四、测试分布式登录:共享 Session
1. 使用 Redis 客户端查看 Session 存储情况
- 在 8080 和 8081 端口启动项目
- 使用 Knife4j 接口文档发送请求
2. 在 8080 登录后获取用户信息
文章来源:https://www.toymoban.com/news/detail-812528.html
3. 在 8081 尝试不登录直接获取用户信息
- 成功获取!✔
- 说明 Session 已经从存在单台服务器上改为存在 Redis 数据库中,实现了分布式 Session 登录
文章来源地址https://www.toymoban.com/news/detail-812528.html
到了这里,关于浪花 - 单机登录升级为分布式 Session 登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!