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