货运搬家小程序从0到1(五):JWT 鉴权,拦截器 + ThreadLocal 用户上下文

上篇登录跑通,拿到了 token。这篇解决"token 发出去之后怎么用":拦截器统一验签,业务代码零感知地拿到当前用户。

为什么不用 Spring Security

我的场景:两种角色(USER/DRIVER/ADMIN)、几十个接口、无 OAuth 无 SSO。Spring Security 的过滤器链、SecurityContext、UserDetailsService 那一套,学习成本远超收益。手写一个 JWT 工具 + 一个 MVC 拦截器,总代码不到 200 行 ,每一行都看得懂、改得动。小项目的安全感来自简单,不是来自重量级框架。

三件套:JwtUtil、AuthContext、拦截器

1. JwtUtil:手写 HS256

JWT 结构是 header.payload.signature,HS256 的签名就是 HMAC-SHA256(header + "." + payload, secret)。不引第三方库也能写:

java 复制代码
public static String create(Long userId, String role) {
    String header  = base64("{\"alg\":\"HS256\",\"typ\":\"JWT\"}");
    String payload = base64("{\"uid\":" + userId + ",\"role\":\"" + role
                          + "\",\"exp\":" + (System.currentTimeMillis()/1000 + 7*86400) + "}");
    String sign = hmacSha256(header + "." + payload, SECRET);
    return header + "." + payload + "." + sign;
}

解析时先验签再取 uid/role,过期抛异常。就这么多,没有魔法。

2. AuthContext:ThreadLocal 存当前用户

java 复制代码
public class AuthContext {
    private static final ThreadLocal<Long> UID = new ThreadLocal<>();
    public static void set(Long uid) { UID.set(uid); }
    public static Long uid() { return UID.get(); }
    public static void clear() { UID.remove(); }   // 关键!
}

3. 拦截器:验签 + 放行名单

java 复制代码
public class AuthInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object h) {
        String token = req.getHeader("Authorization");   // "Bearer eyJ..."
        Long uid = JwtUtil.parseUserId(token.replace("Bearer ", ""));
        if (uid == null) { resp.setStatus(401); return false; }
        AuthContext.set(uid);
        return true;
    }
    public void afterCompletion(...) { AuthContext.clear(); }
}

注册时排除公开接口(/api/auth/**、/api/vehicle-types、管理端登录等)。

之后所有 Controller 写起来非常干净:

java 复制代码
@GetMapping("/api/me")
public Result me() {
    return Result.ok(userService.info(AuthContext.uid()));  // 当前用户直接拿
}

三个必踩的坑,提前避开

  1. ThreadLocal 必须 remove :Tomcat 线程是复用的,不清理会串用户------这是隐蔽性最高的线上事故来源。放 afterCompletion 里最保险
  2. 放行名单别用通配符放开整个 /api:宁可逐个加白名单
  3. 过期策略从简:7 天过期 + 过期重登。token 自动续期(refresh token)第一版不需要,别给自己加戏

本篇成果

全站鉴权闭环:前端请求头自动带 token → 拦截器验签 → 业务代码 AuthContext.uid() 直取当前用户。下一篇写整个系统的心脏:订单状态机与下单支付。


相关推荐
imperialeast13 小时前
WinAXP 2.4.0.830正式版
小程序·个人开发
CRMEB系统商城14 小时前
鲜花零售的预售与积分营销
开发语言·人工智能·科技·小程序·零售
镭封16 小时前
AI文字转语音能制作多人对白吗?角色分配操作指南
人工智能·小程序·音视频·语音识别·媒体
zhongben_keji16 小时前
批发商城APP怎么做:价格引擎、授信台账与资金合规的设计要点
ios·小程序·web app
2501_9159214320 小时前
iOS 实时日志怎么看?KeyMob 的日志过滤、崩溃报告与符号化
android·ios·小程序·https·uni-app·iphone·webview
小小王app小程序开发20 小时前
教育 AI 小程序玩法开发分析
人工智能·小程序
普通人62 天前
uniapp模版JS
开发语言·javascript·小程序·uni-app·1024程序员节
andrsted2 天前
企业培训时间难统一?练题簿让在线免费刷题与培训考核更好安排
学习·微信小程序·小程序·学习方法·刷题
李纲明2 天前
微信小程序 wx.uploadFile 上传失败:合法域名、临时路径与 HTTPS 证书排查
微信小程序·小程序·uploadfile·devdiy·上传失败
hnxaoli2 天前
win10小程序(二十四)批量新建文件夹
小程序