我创建了服务器过滤器,它计算响应大小。它通过创建响应包装器来做到这一点,该包装器ServletOutputStream
使用 Apache Commons包装CountingOutputStream
。此外,包装器使用包装的流创建 PrintWriter。所以理论上,无论使用什么方法来创建实际输出,都应该通过 CountingOutputStream。
问题是,虽然整个事情适用于典型的 servlet 请求,但它对于静态内容却失败了。准确地说,请求被过滤器接收,响应包装器被创建和chain.doFilter()
调用。但是,当它返回时,包装的流声称没有发送任何数据,而实际上已经发送了数据。在进一步调试之后,似乎在提供静态内容期间,响应包装器上既没有也没有调用getOutputStream()
。getWriter()
过滤器和应用程序在Jetty 8.1.x上运行。我浏览了 Jetty 的默认 servlet,它似乎以通常的方式提供静态内容(即通过获取输出流并写入它)。
所以问题是:为什么包装方法被忽略了?