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