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

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

在我看来,发生这种情况的唯一方法是 recycle() 该郊狼响应不会调用方法。我已检查以确保我没有保留对任何请求、响应、outputStream 或 writer 对象的引用。此外,我确保在finally 块中关闭outputStream。然而,这并不能解决这个问题。

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

有帮助吗?

解决方案

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

似乎有什么东西保留了对 servlet 输出流的引用。我将 ServletOutputStream 包装在我自己的 OutputStream 中,然后确保引用被销毁。这解决了该问题,以便我不再看到传入的已提交响应。

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top