java rest接口安全校验通过handlerinterceptor统一处理jwt验证、签名认证等逻辑,prehandle中校验token或签名,threadlocal存用户信息,aftercompletion清理,webmvcconfigurer注册并配置路径放行规则,配合全局异常与result统一封装响应。

Java 中 REST 接口配合拦截器实现安全校验,关键在于把身份验证、权限控制、签名核验等逻辑从 Controller 剥离出来,在请求进入业务方法前统一处理。这种方式不侵入业务代码,可复用、易维护,适合前后端分离或开放平台场景。
用 HandlerInterceptor 拦截并校验 JWT Token
这是最常见也最实用的方式,适用于基于 Token 的登录态管理:
- 实现 HandlerInterceptor 接口,重写 preHandle 方法,在其中提取请求头(如
Authorization: Bearer xxx)中的 JWT - 调用工具类(如
JwtUtils.verify(token))验证签名、过期时间、issuer 等,失败则直接返回401 Unauthorized并写入标准 JSON 错误体(如{"code":401,"message":"Token expired"}) - 校验通过后,解析出用户 ID、角色等信息,存入
request.setAttribute()或更推荐的 ThreadLocal(配合UserHolder.set(user)),供后续 Controller 使用 - 务必在 afterCompletion 中调用
UserHolder.remove(),防止线程池复用导致上下文污染
按路径注册拦截器并配置放行规则
拦截器不会自动生效,必须显式注册,并合理划分保护范围:
- 实现 WebMvcConfigurer,重写
addInterceptors方法 - 使用
addPathPatterns("/api/**")拦截所有 REST 接口(路径前缀按实际调整) - 用
excludePathPatterns()明确放行免校验路径,例如:/login、/register、/actuator/**、/v3/api-docs/**、/swagger-ui/** - 避免拦截静态资源路径(如
/images/**、/css/**),否则前端页面可能加载失败
为第三方调用设计签名认证拦截器
当接口面向外部系统(如合作方、IoT 设备),仅靠 Token 不够安全,需增加请求签名机制:
- 约定客户端在请求头中携带
X-Sign-Version、X-Timestamp、X-Nonce、X-Content-MD5和Authorization(格式如wayz ak:signature) - 拦截器中校验时间戳是否超时(如 ±5 分钟)、nonce 是否重复(可用 Redis 缓存去重)、MD5 是否匹配请求体
- 拼接待签名字符串(含 HTTP 方法、路径、查询参数、时间戳、nonce、body MD5 等),用服务端保存的 SecretKey 计算 HMAC-SHA256,比对客户端传入 signature
- 任一环节失败,返回
403 Forbidden并附带明确错误码(如"code":1003,"message":"Invalid signature")
配合全局异常与响应统一封装
拦截器只负责“拦”,真正让接口体验一致,还需配套机制:
- 定义统一响应结构 Result
,含 code、message、data字段,搭配状态码枚举(如SUCCESS(200)、UNAUTHORIZED(401)、FORBIDDEN(403)) - 用 @RestControllerAdvice 全局捕获异常,将
AuthenticationException、SignatureException等转为Result.error(),确保所有错误路径都输出相同格式 - 拦截器中主动写响应时,也要保持 JSON 结构和状态码风格一致,避免前端要写两套错误处理逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











