使用提交的响应调用Tomcat doFilter()

时间:2020-03-05 18:48:04  来源:igfitidea点击:

我有一个Tomcat过滤器,它根据URL将请求委托给一个处理对象。这是FilterChain中的唯一过滤器。我有一个Ajax应用程序,该应用程序会处理很多请求。

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

在我看来,发生这种情况的唯一方法是,如果没有在土狼响应中调用recycle()方法。我已进行检查以确保我没有保留对任何请求,响应,outputStream或者writer对象的引用。另外,我确保在finally块中关闭outputStream。但是,这不能解决此问题。

听起来我在做一些滥用servlet容器的事情,但是在跟踪它方面遇到了麻烦。

解决方案

回答

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

回答

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

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

这是保持引用的一个奇怪的副作用。但是我不认为它有资格成为Tomcat错误。我怀疑ImageIO.createImageOutputStream()中的错误更可能是持有引用。