浪花 - 单机登录升级为分布式 Session 登录

目录

一、单机登录思路

二、修改为分布式登录的原理和思路

[1. 单机登录的局限性](#1. 单机登录的局限性)

[2. 解决方案:共享存储](#2. 解决方案:共享存储)

[三、使用 Redis 实现分布式登录](#三、使用 Redis 实现分布式登录)

[1. 本地安装 Redis 后启动 Redis](#1. 本地安装 Redis 后启动 Redis)

[2. 引入 Redis 依赖](#2. 引入 Redis 依赖)

[3. 在 application.yml 中配置 Redis 账户和密码](#3. 在 application.yml 中配置 Redis 账户和密码)

[4. Redis 本地可视化管理工具:Another Redis Desktop](#4. Redis 本地可视化管理工具:Another Redis Desktop)

[5. 使用 Redis 存储 Session](#5. 使用 Redis 存储 Session)

[四、测试分布式登录:共享 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. 本地模拟集群

4. 修改种 Session 的机制

  • 发现问题:在 8080、8081 启动服务后,使用 Knife4j 接口文档进行测试,服务器会为同一个域名下的不同端口生成不同的 Session
  • 解决:修改 Cookie 的范围,让同一个域名下的多个端口都共享同一个 Cookie,如 domain: localhost 让域名为 localhost 的请求都共享同一个 Cookie
bash 复制代码
server: 
  reactive:
    session:
      cookie:
        domain: localhost

三、使用 Redis 实现分布式登录

1. 本地安装 Redis 后启动 Redis

Redis 5.0.14 下载:

链接:https://pan.baidu.com/s/1XcsAIrdeesQAyQU2lE3cOg

提取码:vkoi

  • 进入 Redis 安装目录,输入启动命令
bash 复制代码
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 的版本一致

XML 复制代码
<!-- 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 账户和密码

bash 复制代码
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 的版本一致

XML 复制代码
<!-- 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
XML 复制代码
  session:
    timeout: 86400
    store-type: redis

四、测试分布式登录:共享 Session

1. 使用 Redis 客户端查看 Session 存储情况

  • 在 8080 和 8081 端口启动项目
  • 使用 Knife4j 接口文档发送请求

2. 在 8080 登录后获取用户信息

3. 在 8081 尝试不登录直接获取用户信息

  • 成功获取!✔
  • 说明 Session 已经从存在单台服务器上改为存在 Redis 数据库中,实现了分布式 Session 登录
相关推荐
海兰5 小时前
【数据库】tdsql(mysql8.0)优化思考三
数据库·redis
头发还在的女程序员6 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats6 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123457 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
都叫我大帅哥9 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.9 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
腻害兔11 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊11 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
韩楚风12 小时前
【参天引擎】一次宕机后的数据恢复,让我把 Cantian 持久化与恢复的六大机制全搞明白了
服务器·网络·数据库·分布式·mysql·架构·cantian
景同学13 小时前
把 AI 用到线上运维:可行、有效,前提是喂足信息——一次 Full GC 排障实录
java·人工智能·后端