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
実装は、「すでにフィルター処理済み」のリクエスト属性を保管し、属性がすでにそこにある場合はフィルター処理せずに続行します。request
- ServletRequest
オブジェクトにはクライアントのリクエストが含まれます response
- ServletResponse
オブジェクトにはフィルターのレスポンスが含まれます filterChain
- 次のフィルターまたはリソースを呼び出すための FilterChain
ServletExceptionEE
- フィルターの通常の操作を妨げる例外が発生した場合 IOExceptionSE
- 処理中に I/O 関連のエラーが発生した場合 getAlreadyFilteredAttributeName()
, shouldNotFilter(javax.servlet.http.HttpServletRequest)
, doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
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