クラス OncePerRequestFilter

java.lang.ObjectSE
org.springframework.web.filter.GenericFilterBean
org.springframework.web.filter.OncePerRequestFilter
実装されたすべてのインターフェース:
FilterEEAwareBeanNameAwareDisposableBeanInitializingBeanEnvironmentAwareEnvironmentCapableServletContextAware
既知の直属サブクラス
AbstractRequestLoggingFilterCharacterEncodingFilterCorsFilterFormContentFilterForwardedHeaderFilterHiddenHttpMethodFilterMultipartFilterOpenEntityManagerInViewFilterOpenSessionInViewFilterRelativeRedirectFilterRequestContextFilterServerHttpObservationFilterShallowEtagHeaderFilter

public abstract class OncePerRequestFilter extends GenericFilterBean
任意のサーブレットコンテナーで、リクエストディスパッチごとに 1 つの実行を保証することを目的とするフィルター基本クラス。HttpServletRequest および HttpServletResponse 引数を持つ doFilterInternal(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse, jakarta.servlet.FilterChain) メソッドを提供します。

フィルターは、個別のスレッドで発生する REQUESTEE または ASYNCEE ディスパッチの一部として呼び出される場合があります。フィルターは、非同期ディスパッチに関与するかどうかを web.xml で構成できます。ただし、場合によっては、サーブレットコンテナーが異なるデフォルト構成を前提とします。サブクラスはメソッド shouldNotFilterAsyncDispatch() をオーバーライドして、スレッドの初期化、ロギング、セキュリティなどを提供するために、両方の型のディスパッチ中に一度だけ呼び出す必要がある場合、静的に宣言できます。このメカニズムは、web.xml でフィルターをディスパッチャー型で構成する必要性を補完し、置き換えるものではありません。

サブクラスは、isAsyncDispatch(HttpServletRequest) を使用して、非同期ディスパッチの一部としてフィルターが呼び出されるタイミングを決定し、isAsyncStarted(HttpServletRequest) を使用して、リクエストが非同期モードになったため、現在のディスパッチが特定のリクエストの最後ではないことを決定します。

独自のスレッドでも発生するさらに別のディスパッチ型は ERROREE です。サブクラスは、エラーディスパッチ中に 1 回呼び出す必要がある場合に静的に宣言する場合、shouldNotFilterErrorDispatch() をオーバーライドできます。

getAlreadyFilteredAttributeName() メソッドは、リクエストがすでにフィルターされていることを識別する方法を決定します。デフォルトの実装は、具象フィルターインスタンスの設定名に基づいています。

導入:
06.12.2003
作成者:
Juergen Hoeller, Rossen Stoyanchev, Sam Brannen
  • フィールドの詳細

  • コンストラクターの詳細

    • OncePerRequestFilter

      public OncePerRequestFilter()
  • メソッドの詳細

    • doFilter

      public final void doFilter(ServletRequestEE request, ServletResponseEE response, FilterChainEE filterChain) throws ServletExceptionEE, IOExceptionSE
      この doFilter 実装は、「すでにフィルター処理済み」のリクエスト属性を保管し、属性がすでにそこにある場合はフィルター処理せずに続行します。
      例外:
      ServletExceptionEE
      IOExceptionSE
      関連事項:
    • isAsyncDispatch

      protected boolean isAsyncDispatch(HttpServletRequestEE request)
      ディスパッチャー型 jakarta.servlet.DispatcherType.ASYNC は、1 つのリクエストの過程で複数のスレッドでフィルターを呼び出すことができることを意味します。フィルターが現在非同期ディスパッチ内で実行されている場合、このメソッドは true を返します。
      パラメーター:
      request - 現在のリクエスト
      導入:
      3.2
      関連事項:
    • isAsyncStarted

      protected boolean isAsyncStarted(HttpServletRequestEE request)
      リクエスト処理が非同期モードであるかどうか。つまり、現在のスレッドが終了した後、レスポンスがコミットされないことを意味します。
      パラメーター:
      request - 現在のリクエスト
      導入:
      3.2
      関連事項:
    • getAlreadyFilteredAttributeName

      protected StringSE getAlreadyFilteredAttributeName()
      リクエストがすでにフィルタリングされていることを識別するリクエスト属性の名前を返します。

      デフォルトの実装では、構成された具象フィルターインスタンスの名前を使用して、".FILTERED" を追加します。フィルターが完全に初期化されていない場合、そのクラス名にフォールバックします。

      関連事項:
    • shouldNotFilter

      protected boolean shouldNotFilter(HttpServletRequestEE request) throws ServletExceptionEE
      カスタムフィルタリングコントロールのサブクラスでオーバーライドでき、指定されたリクエストのフィルタリングを回避するために true を返します。

      デフォルトの実装は、常に false を返します。

      パラメーター:
      request - 現在の HTTP リクエスト
      戻り値:
      指定されたリクエストを濾過するべきでありません
      例外:
      ServletExceptionEE - エラーの場合
    • shouldNotFilterAsyncDispatch

      protected boolean shouldNotFilterAsyncDispatch()
      ディスパッチャー型 jakarta.servlet.DispatcherType.ASYNC は、1 つのリクエストの過程で複数のスレッドでフィルターを呼び出すことができることを意味します。一部のフィルターは最初のスレッドをフィルタリングするだけで済みます (例: リクエスト 折り返し)。その他のフィルターは、たとえばスレッドローカルを設定するため、または最後に最終処理を実行するために、追加のスレッドごとに少なくとも 1 回呼び出す必要があります。

      フィルターは、web.xml を介して特定のディスパッチャー型を処理するように、または ServletContext を介して Java で処理するようにマップできますが、サーブレットコンテナーはディスパッチャー型に関して異なるデフォルトを適用する場合があることに注意してください。このフラグは、フィルターの設計意図を強制します。

      デフォルトの戻り値は "true" です。これは、後続の非同期ディスパッチ中にフィルターが呼び出されないことを意味します。"false" の場合、フィルターは非同期ディスパッチ中に呼び出され、単一スレッド内のリクエスト中に 1 回だけ呼び出されるという同じ保証があります。

      導入:
      3.2
    • shouldNotFilterErrorDispatch

      protected boolean shouldNotFilterErrorDispatch()
      サーブレットコンテナーが web.xml にマッピングされたときなどのエラーディスパッチをフィルタリングするかどうか。デフォルトの戻り値は "true" です。これは、エラーディスパッチの場合にフィルターが呼び出されないことを意味します。
      導入:
      3.2
    • doFilterInternal

      protected abstract void doFilterInternal(HttpServletRequestEE request, HttpServletResponseEE response, FilterChainEE filterChain) throws ServletExceptionEE, IOExceptionSE
      doFilter と同じ契約ですが、単一のリクエストスレッド内のリクエストごとに 1 回だけ呼び出されることが保証されています。詳細については、shouldNotFilterAsyncDispatch() を参照してください。

      デフォルトの ServletRequest および ServletResponse の代わりに、HttpServletRequest および HttpServletResponse 引数を提供します。

      例外:
      ServletExceptionEE
      IOExceptionSE
    • doFilterNestedErrorDispatch

      protected void doFilterNestedErrorDispatch(HttpServletRequestEE request, HttpServletResponseEE response, FilterChainEE filterChain) throws ServletExceptionEE, IOExceptionSE
      通常、ERROR ディスパッチは、REQUEST ディスパッチが完了した後に発生し、フィルターチェーンが新たに開始されます。ただし、一部のサーバーでは、ERROR ディスパッチが REQUEST ディスパッチ内にネストされている場合があります。レスポンスで sendError を呼び出した結果。その場合、同じスレッドのチェーンフィルターにまだありますが、リクエストとレスポンスは元のラップされていないものに切り替えられています。

      サブクラスはこのメソッドを使用して、ネストされた ERROR ディスパッチをフィルタリングし、リクエストまたはレスポンスにラップを再適用できます。ThreadLocal コンテキスト(存在する場合)は、フィルターチェーン内に入れ子になっているため、まだアクティブである必要があります。

      例外:
      ServletExceptionEE
      IOExceptionSE
      導入:
      5.1.9