我一直试图解决这个问题超过一天。查看了整个互联网并使用多个参考作为示例。
我使用自定义的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);"
但这似乎是一个快速而简单的工作,而不是实际上解决问题。有什么想法吗?
答案 0 :(得分:0)
在ServletOutputStreamCopier中,您必须同时写入原始OutputStream及其副本。再次在答案中查看ServletOutputStreamCopier的代码:How to read and copy the HTTP servlet response output stream content for logging。 ServletOutputStreamCopier的全部要点(从答案开始)是写到原始输出流(到客户端),同时将数据写到第二个流,您可以依次将其用于逻辑。
更新:是的,您可以像在上一个代码片段中那样在完成响应主体之后编写代码。我认为也可以(只是同步)。