Tomcat doFilter() がコミットされた応答で呼び出される
質問
URL に応じてリクエストを処理オブジェクトに委任する Tomcat フィルターがあります。これは、 FilterChain
. 。このフィルターに大量のリクエストを送信する Ajax アプリがあります。
最近、フィルターの問題に気づきました。 doFilter
このメソッドは、多くの場合、コミットされた応答をパラメーターとして指定して呼び出されます (内部的には、コミットされたとマークされているのはコヨーテの応答です)。
これが起こり得る唯一の方法は、 recycle()
このコヨーテの応答ではメソッドは呼び出されません。リクエスト、レスポンス、outputStream、またはライター オブジェクトへの参照を保持していないことを確認しました。さらに、finally ブロックで OutputStream を閉じるようにしました。ただし、これではこの問題は解決されません。
これはサーブレットコンテナを悪用するために何かをしているように思えますが、それを追跡するのに苦労しています。
解決
Tomcat 6.16 と 6.18 を使用してみました。これは間違いなくチェーン内の唯一のフィルターです。
何かがサーブレットのoutputStreamへの参照を保持しているようです。ServletOutputStream を独自の OutputStream でラップし、参照が破棄されていることを確認しました。これにより問題が修正され、コミットされた応答が渡されることはなくなりました。
これは、参照を保持することによる奇妙な副作用です。しかし、それが Tomcat のバグであるとは思えません。おそらく ImageIO.createImageOutputStream() のバグが参照を保持しているのではないかと思われます。
他のヒント
Tomcat のどのバージョンを使用していますか?私には、これは Tomcat のバグのように思えます。すでにコミットされている応答で doFilter メソッドを呼び出す必要がある理由が思いつきません (そのフィルターがチェーン内の唯一のフィルターである場合、これについて確信していますか?) )。