2017-06-21 10 views
2

私はSpringブートベースのアプリケーションを開発しています。非同期エンドポイントの場合、認証フィルターが2回呼び出されることに気付きました。通常のエンドポイントでは、1回呼び出されます。私は理由を見つけることができませんでしたが、非同期エンドポイントの実行の前後に、非同期エンドポイントのフィルタが2回呼び出されていると言われているネットで問題が見つかりました。https://jira.spring.io/browse/SPR-12608それは二重認証の呼び出しを説明するでしょう。私はこの期待された振る舞いが何であるか、また二重認証を避ける方法が何であるかを知りたいと思います。非同期エンドポイントのフィルタチェーンが2回呼び出される理由

UPD: 非同期エンドポイントが終了した後にフィルタが2度目に起動するのを回避する方法を見つけました。私がする必要があるのは、非同期の場合、どのような種類のディスパッチャがリクエストに割り当てられているのかを分析することです。私はフィルタに次のメソッドを追加しました:

@Override 
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) 
     throws ServletException, IOException { 
    if (request.getDispatcherType() == DispatcherType.ASYNC) { 
     filterChain.doFilter(request, response); 
    } else { 
     super.doFilter(request, response, filterChain); 
    } 
} 

答えて

1

私はまったく同じ行動を見ていると私はそれが非同期呼び出しが2つのフェーズに分割されているという事実に関連していると思います。

最初に、通常のコンテナスレッドが起動され、暫定応答が生成されますが、その応答は非同期ディスパッチャが競合するまで保持されているクライアントに返されません。非同期スレッドが処理されると、暫定応答は非同期スレッドからの実際の応答に置き換えられ、クライアントに返されます。

両方のスレッドが同じフィルタチェーンを経由します。したがって、重複呼び出しが表示されます。

フィルタを一度呼び出す場合は、OncePerRequestFilterを拡張する必要があります。要求の処理中にフィルタがすでに呼び出されているかどうかを確認します(要求処理は、それぞれが自分のスレッドによって処理される2つのステージから構成されます)。

関連する問題