当前位置: 首页 > 面试题库 >

ContentCachingResponseWrapper产生空响应

莫典
2023-03-14
问题内容

我正在尝试实现过滤器,以记录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()应当将响应写回到输出流。



 类似资料:
  • HTTP响应消息的响应状态行分为三部分:HTTP版本、状态码和状态信息,如下所示: HTTP/1.1 200 OK 其中HTTP版本可以是HTTP/1.1或HTTP/1.0,这由Web服务器所支持的HTTP版本决定。状态信息的内容和状态相关,如404状态码所对应的HTTP1.1规范中的状态信息是Not Found。由于HTTP版本一般是基本固定的,而状态信息是随着状态码的变化而变的。因此,在HTT

  • 我用的是弹簧靴和摩基托。我自动连接了一个类,即BDSRequest,在Junit测试类中,我使用了@Spy和@InjectMocks注释。但是在Junits中调用rest服务时,我得到的响应(bdsCustomerHoldings)为null,断言失败。如何在没有模拟rest模板(如mockito.when(restTemplate.PostForObject(constants.bds_rest

  • 问题内容: 这真的让我挠头。即是因为它仅在IE中发生,而不在Firefox中发生,而且我给人的印象是jQuery实际上是浏览器无关的。在过去的几个小时中,我一直在努力解决这个问题,至少已经确定了正在发生的事情。 这个jqGrid: 填充此功能: 这是从模型中干净填充的。这不是问题。使用删除功能时会出现问题,该功能在控制器中的格式如下: 并调用此函数 } (showGlobalMessage是一个内

  • 我正试着把它插进带扣的桌子里。当我运行查询时,一切看起来都很好,我在报告中看到一些写入的字节。配置单元日志中也没有任何错误。 但是当我查看表时,我什么也没有:(

  • 我必须记录响应正文和响应标题。为此,我使用了拦截器和ContentCachingResponseWrapper类(我也尝试了filter,但结果相同)。当我将两者结合起来时,我会丢失一些标题信息,但如果我只使用拦截器,则不会丢失。 我的dispatcherServlet: 当我在拦截器的postHandle中使用ContentCachingResponseWrapper时: 标题结果: {设置Co

  • 我正在使用swaggerspring MVC-1.0.2和jackson-databind 2.6.3。为什么它会产生空值。如何停止它?。它停止swagger UI。JSON