使用提交的响应调用 Tomcat doFilter()
题
我有一个 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 方法的任何原因(如果该过滤器是链中唯一的过滤器,您确定这一点吗? )。
不隶属于 StackOverflow