spring boot拦截器解析jwt需手动从authorization头提取bearer token,用jjwt解析为claims对象并存入threadlocal或securitycontext,不可直接反序列化为java对象。

在 Java Spring Boot 项目中,拦截器(Interceptor)本身不参与 HTTP 响应的自动序列化/反序列化流程,所以不能像 @RestController 那样直接接收或返回 Java 对象。当你需要在拦截器中“解析用户身份票据”(比如 JWT),本质是手动从请求头提取 Token 字符串,再用 JWT 库反序列化为 Claims 对象(即票据载荷),而非依赖 Spring 的 HttpMessageConverter。
从请求头提取 JWT 字符串
标准做法是从 Authorization 请求头中读取 Bearer Token:
- 检查 header 是否存在且以
"Bearer "开头 - 截取后半部分作为 raw token 字符串(注意去空格)
- 若 header 缺失、格式错误或 token 为空,直接拒绝访问
用 JJWT 解析 Token 得到 Claims
使用 Jwts.parserBuilder() 构建解析器,传入签名密钥,调用 parseClaimsJws()。成功后从中取出 getBody() 即为反序列化后的票据对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 必须配置正确的签名算法(如 HS256)和密钥,否则抛
SignatureException - 过期、篡改、缺失签发者等校验失败会触发对应异常(
ExpiredJwtException、MalformedJwtException等),需捕获并统一处理 - Claims 是一个 Map-like 结构,可直接用
get("username")、get("role", String.class)获取字段
把解析结果注入到当前请求上下文
拦截器无法返回对象,但可以将用户身份信息存入 RequestContextHolder 或线程局部变量(如 ThreadLocal<authentication></authentication>),供后续 Controller 使用:
- 推荐封装成
UsernamePasswordAuthenticationToken或自定义Authentication实现 - 调用
SecurityContextHolder.getContext().setAuthentication(auth)接入 Spring Security 流程 - 若未集成 Security,也可设到
HttpServletRequest.setAttribute()中临时传递
不建议在拦截器里做 JSON 反序列化
有人误以为要“反序列化用户对象”,其实 JWT 本身不是 JSON 字符串的通用反序列化目标——它是一个加密签名的结构化令牌。你不需要用 ObjectMapper.readValue(token, User.class),那会失败。Claims 已是解析好的票据数据,字段名和类型由你生成时约定,直接取值即可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










