Dofilterメソッドでこの呼び出しchain.doFilterを行ったことを知りたいです。 doFilter内でdoFilterは何をしますか?再帰呼び出しを取得しませんか?
サーブレットフィルターは、 責任のチェーン デザインパターンの実装です。
すべてのフィルターは連鎖されます(web.xmlでの定義の順序で)。 chain.doFilter()
はチェーン内の次の要素に進んでいます。チェーンの最後の要素は、ターゲットリソース/サーブレットです。
それはdoFilter
オブジェクトのchain
メソッドを呼び出しているので、それ自体ではないので、再帰的ではありません。
名前chain
は、一連のフィルターがあることを示しています。各フィルターは処理を行ってから次のフィルターに渡されるため、各オブジェクトには次のフィルターを指すchain
メンバーがあります。フィルタが独自の処理を実行した後に呼び出されるシーケンス。シーケンスの最後は、おそらくnull
の値としてchain
を持つか、それ自体がシーケンスの最後のものであることを知っています。
内部的には、フィルターチェーン内の次のフィルターのdoFilter
を呼び出し、チェーンが終了すると、ターゲットサーブレットを呼び出します。
チェーン内の次のフィルターを呼び出すか、呼び出し元のフィルターがチェーン内の最後のフィルターである場合、チェーンの最後のリソースを呼び出します。
Chain.doFilterを呼び出すことにより、フィルターチェーン内の次のフィルターに要求/応答を渡します。呼び出さない場合、次のフィルター(おそらくweb.xmlで定義されている)は実行されません。
DoFilterを呼び出しただけなら、はい、無限の再帰とスタックオーバーフローが発生します。ただし、次のフィルターの実行を指示するfilterChainオブジェクトのdoFilterメソッドを呼び出しています。
あなたが話しているコードはありません。
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()を呼び出します。別の答えで述べたように、これはよく知られた責任の連鎖の設計パターンです。