我正在处理一个 java 项目,现在我被要求跟踪从我们的服务器发送和发送的数据量。因此,我编写了一个过滤器并将其映射到它应该监控的所有呼叫,就像其他人告诉我的那样。该过滤器可以正常工作,但是我在获取响应大小时遇到了问题。这是我对 doFilter 的基本实现,我正在使用包装器进行响应。
过滤器:
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
if (filterConfig == null)
return;
LogResponseWrapper logResponseWrapper = new LogResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, logResponseWrapper);
}
基于在线示例的包装器:
public class LogResponseWrapper extends HttpServletResponseWrapper
{
public long size = 0;
public PrintWriter myWriter = null;
public OutputStream myOutputStream = null;
LogResponseWrapper(HttpServletResponse response)
{
super(response);
}
@Override
public PrintWriter getWriter()
{
PrintWriter writer = null;
try
{
System.out.println("calling the writer");
writer = super.getWriter();
myWriter = writer;
}
catch (Exception e)
{
e.printStackTrace();
}
return writer;
}
@Override
public ServletOutputStream getOutputStream()
{
ServletOutputStream os = null;
try
{
System.out.println("calling the getOutputStream");
os = super.getOutputStream();
myOutputStream = os;
}
catch (Exception e)
{
e.printStackTrace();
}
return os;
}
}
所以,你看,这是非常基本的并且做了它应该做的事情。但是在调用 chain.doFilter 之后,我似乎无法找出有多少字节被传输到响应中。我已经尝试按照其他人的建议将其转换为 DataOutputStream 和 ByteArrayOutputStream ,但这也不起作用。因此,如果有人对如何执行此操作有任何指示,请随时帮助我。
先感谢您。