我已经创建了服务器过滤器,它计算响应大小。它通过创建响应包装器来实现这一点,该包装器将ServletOutputStream
与Apache Commons CountingOutputStream
包装在一起。另外,包装器创建带有包装流的printwwriter。因此,理论上,无论使用什么方法来创建实际输出,它都应该通过CountingOutputStream。
问题是,虽然所有这些都适用于典型的servlet请求,但它不适用于静态内容。确切地说,请求被过滤器拾取,响应包装被创建,chain.doFilter()
被调用。然而,当它返回时,包装的流声称没有发送数据,而实际上是发送了数据。在进一步调试之后,似乎在提供静态内容期间,响应包装器上既没有调用getOutputStream()
也没有调用getWriter()
。
过滤器和应用程序运行在Jetty 8.1.x上。我已经浏览了Jetty的默认servlet,它似乎以通常的方式提供静态内容(即通过获取输出流并向其写入)。
所以问题是:为什么包装器方法被忽略了?您确定已禁用所有缓存机制吗?
问题原来是我期望一些不可能的事情。我正在向不存在的静态资源发出请求。我仍然期望一些数据通过过滤器,因为http客户端得到一堆头,我的过滤器报告0字节,这只是感觉错误。然而,事实证明过滤器只能看到servlet生成的原始数据(或者在静态内容和jetty - handler的情况下)。当所有的应用程序代码都已经执行时,他们无法看到标题,因为它们是稍后由服务器添加的。虽然我想有总响应大小(标题和内容),但似乎我必须只测量内容。