解决 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");

 

posted @ 2024-09-18 22:17  天启A  阅读(1811)  评论(0)    收藏  举报