解决 HttpMessageNotReadableException: I/O error while reading input message
org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message
原因:使用中request.getInputStream()方法多次调用,其实request.getInputStream()方法只能调用一次。
造成原因的原因:前端懒狗不想把token放到请求头,后端无奈只能在拦截器里读body内的token
//1、从请求体中一个名为token的参数获取令牌 ObjectMapper mapper=new ObjectMapper(); JsonNode rootNode = mapper.readTree(request.getInputStream()); JsonNode tokenNode = rootNode.path("token"); String token = tokenNode.asText(); //2、校验令牌 log.info("jwt校验:{}", token); Claims claims = JwtUtil.parseJWT("ezLogin", token); Long userId = Long.valueOf(claims.get("employee_id").toString()); log.info("当前用户id:{}", userId); BaseContext.setCurrentId(userId);
这样在拦截器内token被正确读取了,但是request.getInputStream()被消费了。当请求真的打入controller时已经读取不到requestbody了
为了应急的解决方案:
在requestbody内加上一个token字段,然后将校验令牌步骤放入controller里。
正确的解决方案:
1.前端把token请求好好放入header
2.在拦截器里不用在请求体大费周章,直接getHeader即可
String header = request.getHeader("token");