在Spring HandlerInterceptorAdapter postHandle中记录响应内容

时间:2017-06-20 07:35:29

标签: java spring

我已经实现了以下方法来记录响应,但它在IOUtils.toString(responseWrapper.getContentInputStream()," UTF-8")中抛出异常;说响应有零字节。我能够访问标题和状态。我怎样才能得到回复机构?

    @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {
    System.out.println("after Request");
    ObjectMapper objectMapper = new ObjectMapper();

    ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);
    HttpStatus responseStatus = HttpStatus.valueOf(responseWrapper.getStatusCode());
    System.out.println(responseWrapper.getStatusCode());
    HttpHeaders responseHeaders = new HttpHeaders();
    for (String headerName : responseWrapper.getHeaderNames()) {
        System.out.println(headerName);
      responseHeaders.add(headerName, responseWrapper.getHeader(headerName));
    }
    String responseBody = IOUtils.toString(responseWrapper.getContentInputStream(), "UTF-8");
    System.out.println(responseBody);
    log.info("Response body {} ",responseBody);
    responseWrapper.copyBodyToResponse();
    }

2 个答案:

答案 0 :(得分:0)

How to read and copy the HTTP servlet response output stream content for logging

有你的答案。获取响应输出流不起作用的原因是因为输出流在生成输出时会被定期写入并刷新。这意味着当你试图在最后得到它时,你只有一个空输出。或者,如果您在开头捕获它,那只意味着您对输出流的消耗拒绝向您的客户端消耗相同的消耗。这就是你必须按照上面的答案复制它的原因。

答案 1 :(得分:0)

您永远不会使用response.getOutputStream()response.getWriter(),因此不会向响应中添加任何数据。这就是为什么它是空的。

您创建的实体

 ResponseEntity<JsonNode> responseEntity = new ResponseEntity<>(responseJson,responseHeaders,responseStatus);

从未使用过,也从未发送过回复。试试,例如。

responseWrapper.getWriter().write("test");

然后检查身体。