web-dev-qa-db-ja.com

doFilter()は、サーブレットの作業が完了する前または後に実行されますか?

javax.servlet.Filter オブジェクトは、認証(サーブレットの作業を行う前にフィルタがリクエストをキャッチする必要がある場合)とXSLT変換(サーブレットを完全に実行する必要がある場合)の両方に使用できます。コンテンツの生成が終了しました)。実際に実行されるのはいつですか?

これは(Webコンテナに)実装に依存していることは知っていますが、これはすべての人が解決する必要のある問題のようです。

たぶん、Webコンテナへのフィルタ登録ごとに設定オプションがどこかに設定されていますか?

追加:

また、フィルターの実行順序は何によって決まりますか? FooFilterがBarFilterの前に実行されるのはなぜですか?

25
Jeremy Powell

本質的に、フィルタチェーンはサーブレットの呼び出しをラップします。チェーンは、「最下部」に到達するまですべてのリンクを処理し、サーブレットの実行を許可してから、チェーンを逆に戻します。たとえば、新しい「サンプルフィルタ」がある場合、doFilter()メソッドは次のようになります。

public void doFilter(ServletRequest request,
      ServletResponse response, FilterChain chain) 
      throws IOException, ServletException {
// do pre-servlet work here
chain.doFilter(request, response);
// do post servlet work here

}
54
Rich Kroll

代替テキストhttp://img228.imageshack.us/img228/8945/filter.png

順序について:仕様から覚えているように、サーブレットコンテナは、フィルタが特定の順序で呼び出されることを保証しません。

7
Roman