使用提交的响应调用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()中的错误更可能是持有引用。