ContentCachingResponseWrapper产生空响应

我正在尝试实现过滤器,以记录Spring MVC应用程序中的请求和响应。我使用以下代码:

@Component

public class LoggingFilter extends OncePerRequestFilter {

private static final Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class);

@Override

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);

ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);

LOGGER.debug(REQUEST_MESSAGE_FORMAT, requestWrapper.getRequestURI(), requestWrapper.getMethod(), requestWrapper.getContentType(),

new ServletServerHttpRequest(requestWrapper).getHeaders(), IOUtils.toString(requestWrapper.getInputStream(), UTF_8));

filterChain.doFilter(requestWrapper, responseWrapper);

LOGGER.debug(RESPONSE_MESSAGE_FORMAT, responseWrapper.getStatus(), responseWrapper.getContentType(),

new ServletServerHttpResponse(responseWrapper).getHeaders(), IOUtils.toString(responseWrapper.getContentInputStream(), UTF_8));

}

}

因此,我收到了我的请求,并按预期方式记录了响应。以下是日志:

2016-10-08 19:10:11.212 DEBUG 11072 --- [qtp108982313-19] by.kolodyuk.logging.LoggingFilter

----------------------------

ID: 1

URI: /resources/1

Http-Method: GET

Content-Type: null

Headers: {User-Agent=[curl/7.41.0], Accept=[*/*], Host=[localhost:9015]}

Body:

--------------------------------------

2016-10-08 19:10:11.277 DEBUG 11072 --- [qtp108982313-19] by.kolodyuk.logging.LoggingFilter

----------------------------

ID: 1

Response-Code: 200

Content-Type: application/json;charset=UTF-8

Headers: {}

Body: {"id":"1"}

--------------------------------------

但是,返回空响应。这是来自的输出curl

$ curl http://localhost:9015/resources/1 --verbose

* Trying ::1...

* Connected to localhost (::1) port 9015 (#0)

> GET /resources/1 HTTP/1.1

> User-Agent: curl/7.41.0

> Host: localhost:9015

> Accept: */*

>

< HTTP/1.1 200 OK

< Date: Sat, 08 Oct 2016 17:10:11 GMT

< Content-Type: application/json;charset=UTF-8

< Content-Length: 0

<

* Connection #0 to host localhost left intact

有任何想法吗?

谢谢

回答:

经过几个小时的努力,我终于找到了解决方案。

简而言之,ContentCachingResponseWrapper.copyBodyToResponse()应该在过滤方法的最后调用。

ContentCachingResponseWrapper通过从响应输出流中读取响应主体来缓存响应主体。因此,流变为空。ContentCachingResponseWrapper.copyBodyToResponse()应当将响应写回到输出流。

以上是 ContentCachingResponseWrapper产生空响应 的全部内容, 来源链接: utcz.com/qa/435011.html

回到顶部