响应记录筛选器 - 浏览器页面上的丢失(响应)内容

时间:2015-08-13 14:13:07

标签: tomcat servlets servlet-filters

我一直试图解决这个问题超过一天。查看了整个互联网并使用多个参考作为示例。

我使用自定义的HttpServletResponseWrapper,并重写了getOutputStream()方法。我基本上遵循这个例子:How to read and copy the HTTP servlet response output stream content for logging

与我使用的其他示例非常相似。但结果是一样的。我成功记录了响应,但是我重定向的JSP页面显示为空。

也许我不了解一些基本面?任何帮助都将不胜感激!

谢谢!

以下是我在示例中使用的代码。可以在此处找到HTTPServeletResponseCopier和ServletOutputStreamCopier:https://github.com/ukwa/interject/tree/master/interject-servlet-filter/src/main/java/uk/bl/wa/interject/filter

  @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    if (response.getCharacterEncoding() == null) {
        response.setCharacterEncoding("UTF-8");
    }

    HttpServletResponseCopier responseCopier = new HttpServletResponseCopier((HttpServletResponse) response);

    try 
    {

        chain.doFilter(request, responseCopier);
        responseCopier.flushBuffer();

    } 
    catch (Exception e)
    {
        System.out.println("EXCEPTION ECNOUTERED - " + e.getMessage());
        e.printStackTrace();
    }
    finally 
    {
      byte[] copy = responseCopier.getCopy();
     System.out.println("Logging.....");
        System.out.println(new String(copy, response.getCharacterEncoding())); // Do your logging job here. This is just a basic example.
        System.out.println("Logging.....");

    }
}

编辑:我想我知道我做错了什么,但我不知道如何修复它。

显然,在处理RESPONSE fIlter时,您需要在过滤器链之后处理响应。这就是为什么我的回答是空的。我尝试做的是

"String responseString = new String(copy);
            response.getWriter().write(responseString);"

但这似乎是一个快速而简单的工作,而不是实际上解决问题。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在ServletOutputStreamCopier中,您必须同时写入原始OutputStream及其副本。再次在答案中查看ServletOutputStreamCopier的代码:How to read and copy the HTTP servlet response output stream content for logging。 ServletOutputStreamCopier的全部要点(从答案开始)是写到原始输出流(到客户端),同时将数据写到第二个流,您可以依次将其用于逻辑。

更新:是的,您可以像在上一个代码片段中那样在完成响应主体之后编写代码。我认为也可以(只是同步)。