web-dev-qa-db-ja.com

JavaのフィルターのdoFilterメソッドでdoFilterは何をしていますか?

Dofilterメソッドでこの呼び出しchain.doFilterを行ったことを知りたいです。 doFilter内でdoFilterは何をしますか?再帰呼び出しを取得しませんか?

36
giri

サーブレットフィルターは、 責任のチェーン デザインパターンの実装です。

すべてのフィルターは連鎖されます(web.xmlでの定義の順序で)。 chain.doFilter()はチェーン内の次の要素に進んでいます。チェーンの最後の要素は、ターゲットリソース/サーブレットです。

52
Bozho

それはdoFilterオブジェクトのchainメソッドを呼び出しているので、それ自体ではないので、再帰的ではありません。

名前chainは、一連のフィルターがあることを示しています。各フィルターは処理を行ってから次のフィルターに渡されるため、各オブジェクトには次のフィルターを指すchainメンバーがあります。フィルタが独自の処理を実行した後に呼び出されるシーケンス。シーケンスの最後は、おそらくnullの値としてchainを持つか、それ自体がシーケンスの最後のものであることを知っています。

13
JaakkoK

内部的には、フィルターチェーン内の次のフィルターのdoFilterを呼び出し、チェーンが終了すると、ターゲットサーブレットを呼び出します。

2
axtavt

チェーン内の次のフィルターを呼び出すか、呼び出し元のフィルターがチェーン内の最後のフィルターである場合、チェーンの最後のリソースを呼び出します。

1
Vivek Parashar

Chain.doFilterを呼び出すことにより、フィルターチェーン内の次のフィルターに要求/応答を渡します。呼び出さない場合、次のフィルター(おそらくweb.xmlで定義されている)は実行されません。

DoFilterを呼び出しただけなら、はい、無限の再帰とスタックオーバーフローが発生します。ただし、次のフィルターの実行を指示するfilterChainオブジェクトのdoFilterメソッドを呼び出しています。

1

あなたが話しているコードはありません。

class Filter implements FilterAPI {
  private FilterAPI chain;
  FilterAPI(FilterAPI chain) { this.chain = chain; }
  @override void doFilter (Set setToFilter) {
    // do some filtering on setToFilter
    chain.doFilter(setToFilter);
  }
}

その場合、再帰的に何かを呼び出すのではなく、別のオブジェクトでdoFilter()を呼び出します。別の答えで述べたように、これはよく知られた責任の連鎖の設計パターンです。

1
Paul Wagland