基于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 判断用户是否存在于上下文中

相关推荐
名字还没想好☜4 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
ltl4 小时前
Serverless 数据库弹性理论:Neon 与 Aurora Serverless v2
数据库
·薯条大王4 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO7 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆7 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光8 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林8 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu8 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
ZCBUS实时计算9 小时前
金融证券实时数仓建设实践:轻量化实时计算平台落地,实现交易数据端到端秒级处理
大数据·数据库·数据仓库·金融·flink·dba·etl
zd2005729 小时前
海洋微生物数据库
数据库·宏基因组