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

问题描述 投票:0回答:1

我已经尝试解决这一问题超过一天了。在整个Internet上进行了浏览,并以多个参考为例。

我使用自定义的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.....");

    }
}

编辑:我想我知道我在做错什么,但是我不知道如何解决。

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

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

但是,这似乎是一种快速,轻松的解决方法,实际上并不能解决问题。有什么想法吗?

tomcat servlets servlet-filters
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.