问题描述
我正在尝试在 Spring MVC
应用程序中实现用于记录请求和响应的过滤器.我使用以下代码:
I'm trying to implement filter for logging requests and responses in Spring MVC
application.I use the following code:
@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));
}
}
因此,我按预期记录了我的请求和响应.以下是日志:
So, I get my request and respone logged as expected. Here are the logs:
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
的输出:
However, the empty response is returned. Here's the output from 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
有什么想法吗?
谢谢
推荐答案
经过几个小时的挣扎,我终于找到了解决方案.
After couple of hours of struggling, I've finally found the solution.
简而言之,ContentCachingResponseWrapper.copyBodyToResponse()
应该在过滤器方法的末尾调用.
In short, ContentCachingResponseWrapper.copyBodyToResponse()
should be called in the end of the filter method.
ContentCachingResponseWrapper
通过从响应输出流中读取响应主体来缓存响应主体.因此,流变为空.要将响应写回输出流 ContentCachingResponseWrapper.copyBodyToResponse()
应该使用.
ContentCachingResponseWrapper
caches the response body by reading it from response output stream. So, the stream becomes empty. To write response back to the output stream ContentCachingResponseWrapper.copyBodyToResponse()
should be used.
这篇关于ContentCachingResponseWrapper 产生空响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!