【问题标题】:Servlet Response Wrapper ignored for static content忽略静态内容的 Servlet 响应包装器
【发布时间】:2014-09-08 12:41:07
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java servlets servlet-filters jetty-8


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        • 2021-12-25
        • 1970-01-01
        • 2011-11-08
        相关资源
        最近更新 更多