核心是用拦截器在请求进入Controller前统一校验JWT,合法才放行;需实现HandlerInterceptor的preHandle方法提取并验证Token,注册时配置保护路径与放行例外,配合ThreadLocal透传用户信息,并返回标准JSON格式错误响应。

在 REST 接口开发中,用拦截器实现登录校验,核心是在请求进入 Controller 之前统一检查身份凭证(如 JWT Token),合法才放行。它不侵入业务代码,适合前后端分离场景,比每个接口手动校验更简洁可靠。
定义拦截器:在 preHandle 中完成 Token 解析与校验
创建一个类实现 HandlerInterceptor,重点重写 preHandle 方法:
- 从请求头(如
Authorization或token)或参数中提取 Token;若未提供,直接返回 401 错误 - 调用工具类(如
JwtUtils.checkJWT())验证签名、有效期和载荷完整性 - 校验通过后,把用户信息(如 userId、username)存入
request.setAttribute()或ThreadLocal,供后续 Controller 使用 - 返回
false表示拦截,需手动写响应(如 JSON 格式错误提示);返回true才继续执行
注册拦截器:指定保护路径与放行例外
通过实现 WebMvcConfigurer 并重写 addInterceptors 方法来注册:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 使用
addPathPatterns("/api/**")拦截所有 API 请求(按实际前缀调整) - 必须用
excludePathPatterns()放行免校验路径,例如:/login、/register、/actuator/**、/swagger-ui/**、/v3/api-docs/** - 避免拦截静态资源(如
/images/**、/css/**),否则前端页面可能无法加载
配合 ThreadLocal 实现用户上下文透传
为避免在每个 Controller 方法里重复取用户信息,建议封装一个 UserHolder 工具类:
- 内部使用
static ThreadLocal<User>存储当前请求的用户对象 - 拦截器校验成功后调用
UserHolder.set(user) - Controller 或 Service 中可随时通过
UserHolder.getUserId()获取 ID,无需传参 - 务必在
afterCompletion方法中调用UserHolder.remove(),防止线程复用导致信息错乱
补充细节:异常响应要友好、安全
拦截器中不要只抛异常或打印日志,要主动构造标准响应:
- 返回 HTTP 状态码:401(未认证)、403(无权限)、429(限流)等,便于前端统一处理
- 响应体推荐 JSON 格式,例如:
{"code":401,"msg":"登录已过期,请重新登录"} - 设置响应头
Content-Type: application/json; charset=utf-8 - 避免暴露敏感信息,如堆栈、内部类名、Token 解析失败的具体原因

















