【问题标题】:Tomcat doFilter() invoked with committed responseTomcat doFilter() 调用并提交响应
【发布时间】:2010-09-07 21:42:29
【问题描述】:

我有一个 Tomcat 过滤器,它根据 URL 将请求委托给处理对象。这是FilterChain 中的唯一过滤器。我有一个 Ajax 应用程序,它通过大量请求来敲击这个过滤器。

最近我注意到一个问题,即过滤器的doFilter 方法经常以提交的响应作为参数调用(在内部,它是标记为已提交的土狼响应)。

在我看来,发生这种情况的唯一方法是在此 coyote 响应上未调用 recycle() 方法。我已检查以确保我没有保留对任何请求、响应、输出流或写入器对象的引用。此外,我确保在 finally 块中关闭 outputStream。但是,这并不能解决此问题。

这听起来像是我在做一些事情来滥用 servlet 容器,但我无法追踪它。

【问题讨论】:

    标签: java tomcat servlets


    【解决方案1】:

    您使用的是什么版本的 Tomcat?对我来说,这听起来像是 Tomcat 中的一个错误,我想不出任何理由为什么应该使用已经提交的响应调用您的 doFilter 方法(如果该过滤器是链中唯一的一个,您确定吗? )。

    【讨论】:

      【解决方案2】:

      我曾尝试使用 Tomcat 6.16 和 6.18。这绝对是链中唯一的过滤器。

      似乎有些东西正在保留对 servlet outputStream 的引用。我将 ServletOutputStream 包装在自己的 OutputStream 中,然后确保引用被销毁。这解决了问题,因此我不再看到传入的已提交响应。

      这是持有引用的奇怪副作用。但我认为它不符合 Tomcat 错误的条件。更可能是 ImageIO.createImageOutputStream() 中的一个错误,我怀疑它持有引用。

      【讨论】:

      • 我们必须做同样的事情。包装输出流并防止它在我们准备好之前提交响应。
      猜你喜欢
      • 2012-06-17
      • 1970-01-01
      • 2019-09-21
      • 2012-09-23
      • 1970-01-01
      • 2017-11-10
      • 2014-07-30
      • 2012-09-23
      • 1970-01-01
      相关资源
      最近更新 更多