基于JWT+Redis的登录流程实现

基于JWT+Redis的登录流程实现的 Mermaid 时序图,详细展示了验证码生成、登录验证、JWT签发、Redis存储及拦截器校验等全过程。

java 复制代码
sequenceDiagram
    participant 用户
    participant 前端页面
    participant 后端服务
    participant Redis
    participant JwtUtil
    participant 拦截器
    participant LoginUserContext

    %% 获取验证码流程
    用户->>前端页面: 请求获取验证码
    前端页面->>后端服务: /getCaptcha
    后端服务->>后端服务: 创建SpecCaptcha图形验证码
    后端服务->>后端服务: 生成验证码文本(verCode)
    后端服务->>Redis: set("code:{uuid}", verCode, 30分钟)
    后端服务-->>前端页面: 返回验证码Base64图像和验证码key

    %% 登录流程
    用户->>前端页面: 输入账号、密码、验证码
    前端页面->>后端服务: /loginRedis(username, password, captchaCode, captchaKey)
    后端服务->>Redis: 获取验证码 get("code:{captchaKey}")
    alt 验证码错误
        后端服务-->>前端页面: 验证码错误,抛出异常
    else 验证码正确
        后端服务->>后端服务: sha256加密密码
        后端服务->>数据库: 查询用户(username+加密密码)
        alt 用户不存在
            后端服务-->>前端页面: 用户名或密码错误
        else 用户存在
            JwtUtil->>JwtUtil: 生成JWT token
            后端服务->>Redis: set("login:{token}", LoginUser, 30分钟)
            后端服务-->>前端页面: 返回token
        end
    end

    %% 用户请求其他接口
    用户->>前端页面: 携带Token访问接口
    前端页面->>拦截器: 添加 Authorization: Bearer {token}
    拦截器->>JwtUtil: 解析JWT Token
    JwtUtil-->>拦截器: 提取 userId、username
    拦截器->>LoginUserContext: 保存用户信息到ThreadLocal

    %% 刷新token(可选)
    拦截器->>Redis: 获取用户信息 login:{token}
    alt 用户存在
        Redis->>拦截器: 返回用户信息
        拦截器->>LoginUserContext: 保存用户
        拦截器->>Redis: 重置token过期时间
    else 用户信息不存在
        拦截器-->>前端页面: 拦截请求
    end

    %% 请求完成后清除ThreadLocal
    拦截器->>LoginUserContext: 清除用户信息(clear)

基于JWT+Redis的登录流程实现 补充说明:

1、验证码生成依赖:com.wf.captcha.SpecCaptcha

2、密码加密方式:DigestUtils.sha256Hex

3、登录成功后会:

创建 JWT Token(包含 userId 和 username)

将用户信息以 "login:{token}" 存入 Redis,有效期30分钟

后续所有接口请求都需要在 Header 中携带 Authorization: Bearer {token}

4、使用多个拦截器进行权限验证与刷新:

AuthenticationInterceptor 负责解析 Token 并设置上下文

RefreshTokenInterceptor 刷新 Token 过期时间

LoginInterceptor 判断用户是否存在于上下文中

相关推荐
Rocky4015 分钟前
JAVAEE->多线程:锁策略
java·开发语言·jvm
白宇横流学长5 分钟前
基于J2EE架构的在线考试系统设计与实现【源码+文档】
java·架构·java-ee
猫咪老师199510 分钟前
多系统一键打包docker compose下所有镜像并且使用
java·docker·容器
jay神19 分钟前
基于Springboot的宠物领养系统
java·spring boot·后端·宠物·软件设计与开发
Java初学者小白21 分钟前
秋招Day12 - 计算机网络 - IP
java
JSUITDLWXL31 分钟前
ideal2022.3.1版本编译项目报java: OutOfMemoryError: insufficient memory
java·开发语言
magic 24534 分钟前
Java建造者模式(Builder Pattern)详解与实践
java·开发语言·建造者模式
不知几秋1 小时前
Spring Boot
java·前端·spring boot
文牧之1 小时前
Oracle 审计参数:AUDIT_TRAIL 和 AUDIT_SYS_OPERATIONS
运维·数据库·oracle
篱笆院的狗1 小时前
如何使用 Redis 快速实现布隆过滤器?
数据库·redis·缓存