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

相关推荐
Mr.Entropy21 小时前
JdbcTemplate 性能好,但 Hibernate 生产力高。 如何选择?
java·后端·hibernate
菜鸟233号21 小时前
力扣96 不同的二叉搜索树 java实现
java·数据结构·算法·leetcode
小张程序人生21 小时前
ShardingJDBC读写分离详解与实战
数据库
木风小助理21 小时前
三大删除命令:MySQL 核心用法解析
数据库·oracle
tc&21 小时前
redis_cmd 内置防注入功能的原理与验证
数据库·redis·bootstrap
sww_102621 小时前
Spring-AI和LangChain4j区别
java·人工智能·spring
泡泡以安21 小时前
【爬虫教程】第7章:现代浏览器渲染引擎原理(Chromium/V8)
java·开发语言·爬虫
麦聪聊数据21 小时前
MySQL 性能调优:从EXPLAIN到JSON索引优化
数据库·sql·mysql·安全·json
月明长歌21 小时前
Java进程与线程的区别以及线程状态总结
java·开发语言
汪不止21 小时前
使用模板方法模式实现可扩展的动态查询过滤器
java·模板方法模式