public interface AsyncHandlerInterceptor extends HandlerInterceptor
HandlerInterceptor
を拡張します。 ハンドラーが非同期リクエストを開始すると、DispatcherServlet
は、通常の同期リクエストの場合と同様に、postHandle
および afterCompletion
を呼び出さずに終了します。これは、リクエスト処理の結果(ModelAndView など)がまだ準備ができておらず、別のスレッドから同時に生成されるためです。そのようなシナリオでは、代わりに afterConcurrentHandlingStarted(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object)
が呼び出され、サーブレットコンテナーにスレッドを解放する前に実装がスレッドバインド属性のクリーンアップなどのタスクを実行できるようにします。
非同期処理が完了すると、リクエストはさらに処理するためにコンテナーにディスパッチされます。この段階で、DispatcherServlet
は preHandle
、postHandle
、afterCompletion
を呼び出します。非同期処理が完了した後の最初のリクエストと後続のディスパッチを区別するために、インターセプターは ServletRequest
EE の javax.servlet.DispatcherType
が "REQUEST"
であるか "ASYNC"
であるかを確認できます。
HandlerInterceptor
実装は、非同期リクエストがタイムアウトするか、ネットワークエラーで完了したときに機能する必要がある場合があることに注意してください。このような場合、サーブレットコンテナーはディスパッチしないため、postHandle
および afterCompletion
メソッドは呼び出されません。代わりに、インターセプターを登録して、WebAsyncManager
の registerCallbackInterceptor
および registerDeferredResultInterceptor
メソッドを介して非同期リクエストを追跡できます。これは、非同期リクエスト処理が開始されるかどうかに関係なく、preHandle
からのすべてのリクエストで事前に実行できます。
WebAsyncManager
, CallableProcessingInterceptor
, DeferredResultProcessingInterceptor
修飾子と型 | メソッドと説明 |
---|---|
default void | afterConcurrentHandlingStarted(HttpServletRequestEE request, HttpServletResponseEE response, ObjectSE handler) ハンドラーが同時に実行されている場合、 postHandle および afterCompletion の代わりに呼び出されます。 |
afterCompletion, postHandle, preHandle
default void afterConcurrentHandlingStarted(HttpServletRequestEE request, HttpServletResponseEE response, ObjectSE handler) throws ExceptionSE
postHandle
および afterCompletion
の代わりに呼び出されます。実装では、提供されたリクエストとレスポンスを使用できますが、ハンドラーの同時実行と競合する方法で変更しないでください。このメソッドの典型的な使用箇所は、スレッドローカル変数をクリーンアップすることです。
request
- 現在のリクエスト response
- 現在のレスポンス handler
- 型および / またはインスタンスの検査のために、非同期実行を開始したハンドラー(または HandlerMethod
)ExceptionSE
- エラーの場合