8

URL に応じて処理オブジェクトにリクエストを委任する Tomcat フィルターがあります。これは、 の唯一のフィルタFilterChainです。このフィルターを大量のリクエストで処理する Ajax アプリがあります。

最近、フィルターのdoFilterメソッドがコミットされた応答をパラメーターとして使用して呼び出されることが多いという問題に気付きました (内部的には、コミット済みとしてマークされているのはコヨーテの応答です)。

これが発生する唯一のrecycle()方法は、このコヨーテの応答でメソッドが呼び出されない場合です。request、response、outputStream、または writer オブジェクトへの参照を保持していないことを確認しました。さらに、finally ブロックで outputStream を閉じるようにしました。ただし、これはこの問題を解決しません。

これは、サーブレット コンテナーを悪用するために何かをしているように聞こえますが、追跡に問題があります。

4

2 に答える 2

4

Tomcat6.16および6.18を使用してみました。これは間違いなくチェーン内の唯一のフィルターです。

何かがサーブレットoutputStreamへの参照を保持しているようです。ServletOutputStreamを自分のOutputStreamでラップしてから、参照が破棄されていることを確認しました。これにより問題が修正され、コミットされた応答が渡されなくなりました。

これは、参照を保持することの奇妙な副作用です。しかし、Tomcatのバグとは見なされないと思います。おそらく、ImageIO.createImageOutputStream()のバグであり、参照を保持していると思われます。

于 2008-09-05T17:14:40.767 に答える
0

Tomcat のどのバージョンを使用していますか? 私にはこれは Tomcat のバグのように思えますが、既にコミットされた応答で doFilter メソッドを呼び出す必要がある理由が思いつきません (そのフィルターがチェーン内の唯一のものである場合、これについて確信がありますか? )。

于 2008-09-05T08:16:09.750 に答える