0

我创建了服务器过滤器,它计算响应大小。它通过创建响应包装器来做到这一点,该包装器ServletOutputStream使用 Apache Commons包装CountingOutputStream。此外,包装器使用包装的流创建 PrintWriter。所以理论上,无论使用什么方法来创建实际输出,都应该通过 CountingOutputStream。

问题是,虽然整个事情适用于典型的 servlet 请求,但它对于静态内容却失败了。准确地说,请求被过滤器接收,响应包装器被创建和chain.doFilter()调用。但是,当它返回时,包装的流声称没有发送任何数据,而实际上已经发送了数据。在进一步调试之后,似乎在提供静态内容期间,响应包装器上既没有也没有调用getOutputStream()getWriter()

过滤器和应用程序在Jetty 8.1.x上运行。我浏览了 Jetty 的默认 servlet,它似乎以通常的方式提供静态内容(即通过获取输出流并写入它)。

所以问题是:为什么包装方法被忽略了?

4

2 回答 2

0

你确定你禁用了所有的缓存机制吗?

于 2014-07-17T15:02:16.433 回答
0

问题原来是我期待一些不太可能的事情。我正在向不存在的静态资源发出请求。我仍然希望一些数据通过过滤器,因为 http 客户端收到一堆标题,而我的过滤器报告了 0 个字节,这简直是错误的。然而,事实证明,过滤器只能看到 servlet 生成的原始数据(或者在静态内容和码头处理程序的情况下)。当所有应用程序代码都已执行时,他们看不到标头,因为它们稍后由服务器添加。虽然我想要总响应大小(标题和内容),但似乎我必须安定下来,只测量内容。

于 2014-07-21T14:31:40.953 回答