Spring Boot JWT认证遇JsonParseException,需传用户ID到Angular5
解决Spring Boot JWT认证时的JsonParseException问题
看起来你遇到的com.fasterxml.jackson.core.JsonParseException: Unrecognized token错误,核心是Jackson解析JSON数据时碰到了不符合格式的内容,再加上dispatcherServlet的报错,大概率是前端请求格式不对或者后端JWT过滤器的JSON处理逻辑有问题,咱们一步步来排查和解决:
一、先排查前端请求的格式问题
Angular5前端发送认证请求(比如登录接口)时,很容易因为格式不符导致后端解析失败:
- 确认请求的
Content-Type是不是application/json,如果前端用了表单格式(application/x-www-form-urlencoded),但后端用@RequestBody接收参数,就会直接触发JSON解析异常 - 检查请求体的JSON语法是否正确,比如有没有遗漏逗号、引号不配对的情况,正确的登录请求体应该类似:
{"username":"yourAccount","password":"yourPassword"} - 如果用Angular的
HttpClient发送请求,确保是post(url, requestBody)的形式,不要把参数拼在URL里,也不要用表单提交的方式传递JSON数据
二、检查JWTAuthenticationFilter的JSON解析逻辑
你的JWTAuthenticationFilter里肯定有读取请求体、解析用户认证信息的代码,这里是高频出错点:
- 避免重复读取请求流:Servlet的请求流只能读取一次,如果之前有其他过滤器提前读取了流,要改用
ContentCachingRequestWrapper包装请求,保证后续能正常获取请求体 - 检查手动解析的代码,比如下面这种写法要确保读取到的内容是合法JSON:
可以在解析前加个日志打印String requestBody = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8); LoginRequest loginRequest = objectMapper.readValue(requestBody, LoginRequest.class);requestBody,看看是不是真的是预期的JSON字符串
三、排查JWTAuthorizationFilter的Token解析问题
如果是在授权阶段触发的错误,大概率是前端传递的Token格式不对:
- 确认前端在请求头里的
Authorization字段是不是严格遵循Bearer <token>的格式,有没有多空格、少空格,或者直接传了Token没加Bearer前缀 - 后端解析Token时要做容错处理,比如:
要是没做前置判断,String authHeader = request.getHeader("Authorization"); if (authHeader == null || !authHeader.startsWith("Bearer ")) { // 处理Token不存在或格式错误的情况,不要直接抛出异常 chain.doFilter(request, response); return; } String token = authHeader.substring(7);substring(7)会在Token格式错误时抛出异常,进而引发连锁的JSON解析报错
四、DispatcherServlet报错的关联处理
DispatcherServlet的报错一般是前面的JSON解析异常引发的连锁反应,只要解决了核心的JsonParseException,这个报错自然会消失。建议你查看完整的堆栈跟踪,找到最开始抛出异常的类和方法,能帮你精准定位问题位置。
额外调试建议
- 打开Spring Boot的DEBUG日志,配置日志级别为
DEBUG后,可以看到请求的完整头信息和请求体,能直观判断前端传的内容是否符合预期 - 先用Postman测试后端接口:如果Postman请求正常,说明问题出在Angular的请求逻辑上;如果Postman也报错,那就是后端过滤器或接口的处理逻辑有问题
内容的提问来源于stack exchange,提问作者dEs12ZER
相关产品推荐
相关产品推荐

