public abstract class OncePerRequestFilter extends GenericFilterBean
doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
メソッドを提供します。Servlet 3.0 では、フィルターは、別々のスレッドで発生する REQUEST
EE または ASYNC
EE ディスパッチの一部として呼び出される場合があります。フィルターは、非同期ディスパッチに含める必要があるかどうかを web.xml
で構成できます。ただし、サーブレットコンテナーが異なるデフォルト設定を想定している場合があります。サブクラスはメソッド shouldNotFilterAsyncDispatch()
をオーバーライドして、スレッドの初期化、ロギング、セキュリティなどを提供するために、両方の型のディスパッチ中に実際に一度呼び出される必要があるかどうかを静的に宣言できます。このメカニズムは、web.xml
でフィルターをディスパッチャー型で構成する必要性を補完し、置き換えるものではありません。
サブクラスは、isAsyncDispatch(HttpServletRequest)
を使用して、非同期ディスパッチの一部としてフィルターが呼び出されるタイミングを決定し、isAsyncStarted(HttpServletRequest)
を使用して、リクエストが非同期モードになったため、現在のディスパッチが特定のリクエストの最後ではないことを決定します。
独自のスレッドでも発生するさらに別のディスパッチ型は ERROR
EE です。サブクラスは、エラーディスパッチ中に 1 回呼び出す必要がある場合に静的に宣言する場合、shouldNotFilterErrorDispatch()
をオーバーライドできます。
getAlreadyFilteredAttributeName()
メソッドは、リクエストがすでにフィルターされていることを識別する方法を決定します。デフォルトの実装は、具象フィルターインスタンスの設定名に基づいています。
修飾子と型 | フィールドと説明 |
---|---|
static StringSE | ALREADY_FILTERED_SUFFIX 「すでにフィルタリングされた」リクエスト属性のフィルター名に追加されるサフィックス。 |
logger
コンストラクターと説明 |
---|
OncePerRequestFilter() |
修飾子と型 | メソッドと説明 |
---|---|
void | doFilter(ServletRequestEE request, ServletResponseEE response, FilterChainEE filterChain) この doFilter 実装は、「すでにフィルター処理済み」のリクエスト属性を保管し、属性がすでにそこにある場合はフィルター処理せずに続行します。 |
protected abstract void | doFilterInternal(HttpServletRequestEE request, HttpServletResponseEE response, FilterChainEE filterChain) doFilter と同じ契約ですが、単一のリクエストスレッド内のリクエストごとに 1 回だけ呼び出されることが保証されています。 |
protected void | doFilterNestedErrorDispatch(HttpServletRequestEE request, HttpServletResponseEE response, FilterChainEE filterChain) 通常、ERROR ディスパッチは、REQUEST ディスパッチが完了した後に発生し、フィルターチェーンが新たに開始されます。 |
protected StringSE | getAlreadyFilteredAttributeName() リクエストがすでにフィルタリングされていることを識別するリクエスト属性の名前を返します。 |
protected boolean | isAsyncDispatch(HttpServletRequestEE request) Servlet 3.0 で導入されたディスパッチャー型 javax.servlet.DispatcherType.ASYNC は、1 つのリクエストの過程で複数のスレッドでフィルターを呼び出すことができることを意味します。 |
protected boolean | isAsyncStarted(HttpServletRequestEE request) リクエスト処理が非同期モードであるかどうか。つまり、現在のスレッドが終了した後、レスポンスがコミットされないことを意味します。 |
protected boolean | shouldNotFilter(HttpServletRequestEE request) カスタムフィルタリングコントロールのサブクラスでオーバーライドでき、指定されたリクエストのフィルタリングを回避するために true を返します。 |
protected boolean | shouldNotFilterAsyncDispatch() Servlet 3.0 で導入されたディスパッチャー型 javax.servlet.DispatcherType.ASYNC は、1 つのリクエストの過程で複数のスレッドでフィルターを呼び出すことができることを意味します。 |
protected boolean | shouldNotFilterErrorDispatch() サーブレットコンテナーが web.xml にマッピングされたときなどのエラーディスパッチをフィルタリングするかどうか。 |
addRequiredProperty, afterPropertiesSet, createEnvironment, destroy, getEnvironment, getFilterConfig, getFilterName, getServletContext, init, initBeanWrapper, initFilterBean, setBeanName, setEnvironment, setServletContext
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public static final StringSE ALREADY_FILTERED_SUFFIX
public final void doFilter(ServletRequestEE request, ServletResponseEE response, FilterChainEE filterChain) throws ServletExceptionEE, IOExceptionSE
doFilter
実装は、「すでにフィルター処理済み」のリクエスト属性を保管し、属性がすでにそこにある場合はフィルター処理せずに続行します。protected boolean isAsyncDispatch(HttpServletRequestEE request)
javax.servlet.DispatcherType.ASYNC
は、1 つのリクエストの過程で複数のスレッドでフィルターを呼び出すことができることを意味します。このメソッドは、フィルターが現在非同期ディスパッチ内で実行されている場合、true
を返します。request
- 現在のリクエスト WebAsyncManager.hasConcurrentResult()
protected boolean isAsyncStarted(HttpServletRequestEE request)
request
- 現在のリクエスト WebAsyncManager.isConcurrentHandlingStarted()
protected StringSE getAlreadyFilteredAttributeName()
デフォルトの実装では、構成された具象フィルターインスタンスの名前を使用して、".FILTERED" を追加します。フィルターが完全に初期化されていない場合、そのクラス名にフォールバックします。
protected boolean shouldNotFilter(HttpServletRequestEE request) throws ServletExceptionEE
true
を返します。 デフォルトの実装は、常に false
を返します。
request
- 現在の HTTP リクエスト ServletExceptionEE
- エラーの場合 protected boolean shouldNotFilterAsyncDispatch()
javax.servlet.DispatcherType.ASYNC
は、1 つのリクエストの過程で複数のスレッドでフィルターを呼び出すことができることを意味します。いくつかのフィルターは、初期スレッド(たとえば、リクエストの折り返し)のみをフィルターする必要がありますが、他のフィルターは、たとえばスレッドローカルを設定するため、または最後に最終処理を実行するために、追加の各スレッドで少なくとも 1 回呼び出す必要がある場合があります フィルターは、web.xml
を介して特定のディスパッチャー型を処理するように、または ServletContext
を介して Java で処理するようにマップできますが、サーブレットコンテナーはディスパッチャー型に関して異なるデフォルトを適用する場合があることに注意してください。このフラグは、フィルターの設計意図を強制します。
デフォルトの戻り値は "true" です。これは、後続の非同期ディスパッチ中にフィルターが呼び出されないことを意味します。"false" の場合、フィルターは非同期ディスパッチ中に呼び出され、単一スレッド内のリクエスト中に 1 回だけ呼び出されるという同じ保証があります。
protected boolean shouldNotFilterErrorDispatch()
web.xml
にマッピングされたときなどのエラーディスパッチをフィルタリングするかどうか。デフォルトの戻り値は "true" です。これは、エラーディスパッチの場合にフィルターが呼び出されないことを意味します。protected abstract void doFilterInternal(HttpServletRequestEE request, HttpServletResponseEE response, FilterChainEE filterChain) throws ServletExceptionEE, IOExceptionSE
doFilter
と同じ契約ですが、単一のリクエストスレッド内のリクエストごとに 1 回だけ呼び出されることが保証されています。詳細については、shouldNotFilterAsyncDispatch()
を参照してください。デフォルトの ServletRequest および ServletResponse の代わりに、HttpServletRequest および HttpServletResponse 引数を提供します。
protected void doFilterNestedErrorDispatch(HttpServletRequestEE request, HttpServletResponseEE response, FilterChainEE filterChain) throws ServletExceptionEE, IOExceptionSE
sendError
を呼び出した結果。その場合、同じスレッドのチェーンフィルターにまだありますが、リクエストとレスポンスは元のラップされていないものに切り替えられています。 サブクラスはこのメソッドを使用して、ネストされた ERROR ディスパッチをフィルタリングし、リクエストまたはレスポンスにラップを再適用できます。ThreadLocal
コンテキスト(存在する場合)は、フィルターチェーン内に入れ子になっているため、まだアクティブである必要があります。
ServletExceptionEE
IOExceptionSE