私はすでにこのトピックに関連するいくつかの質問を見つけましたが、それらのどれもがこのトピックに光を当てていないことに気づきました。
どうやらOncePerRequestFilterは、リクエストがフィルターチェーンで一度だけフィルターを通過することを保証しますが、その逆がいつ発生するかは正確にはわかりません。
どちらか一方を使用するいくつかのシナリオを見るとよいでしょう。また、フィルターがフィルターチェーンに数回適用されるタイミングと方法の例も示します。
たとえば.
OncePerRequestFilter
状態のjavadoc
サーブレット3.0以降、別個のスレッドで発生する_
javax.servlet.DispatcherType REQUEST
_または_javax.servlet.DispatcherType ASYNC
_ディスパッチの一部としてフィルターを呼び出すことができます。フィルターは、非同期ディスパッチに含める必要があるかどうかにかかわらず、_web.xml
_で構成できます。ただし、場合によっては、サーブレットコンテナは異なるデフォルト設定を想定しています。したがって、サブクラスは、メソッドshouldNotFilterAsyncDispatch()
をオーバーライドして、スレッドの初期化を提供するために、両方のタイプのディスパッチ中に実際に呼び出す必要がある場合onceを静的に宣言できます。 、ロギング、セキュリティなど。このメカニズムは、_web.xml
_のフィルターをディスパッチャタイプで構成する必要性を補完し、置き換えるものではありません。
つまり、環境に関係なく同じように機能するようにするために、Springに実装された追加の「安全」機能です。それを拡張するクラスを見ると、たくさんあることがわかります。 CorsFilter
を含みます。 それを拡張しないSpringフィルタがあるかどうかはわかりませんが、おそらく拡張されません。