0

ここ数日、春のインターセプターで遊んでいて、インターセプターを介して特定のリクエストをキャッチして処理したいと考えています。私がしたいのは、特定のコントローラーによって処理される前に各リクエストを傍受し、リクエストに特定のパラメーターが含まれているかどうかを確認することです。はいの場合は、いくつかのことを行い、その要求をマップするコントローラーに署名します。

最後にそれを行うことができましたが、異なるパラメーター値で一度に複数のリクエストを実行すると、最後のリクエストのパラメーター値のみが各コントローラーハンドラーに割り当てられます。すべてのコントローラーでさえ、リクエストに含まれるパラメーターを持つ必要があります。

例(同時に実行):

http://domain.com/controller/method?param=xfg

http://domain.com/controller/method?param=mtc

http://domain.com/controller/method?param=abc

各リクエストからの応答で、abc! を取得します。(xfg と abc、または mtc と abc を取得することもありますが、3 つすべてを取得することはありません)。次のリクエストが呼び出される前にすべてのリクエストが完了する時間があるタイムアウトでこれらのリクエストを実行すると、正常に機能しています。

誰もこれを処理する方法を知っていますか?

ありがとう

更新しました:

public class OLMyInterceptor extends HandlerInterceptorAdapter {

    static Logger LOG = Logger.getLogger(OLAuthentificationInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     Map<String, Object> activeParamsMap = request.getParameterMap();
         for(Entry<String, Object> param : activeParamsMap.entrySet()) {
             if(param.getKey().startsWith("aP_")) {
                  activeParams.put(param.getKey().substring(3), param.getValue());
             }
         }

         ((MainController) handler).setParams(activeParams);

         return true;
    }
}

そこにコードサンプルがあります。私のすべてのコントローラーは MainController を拡張します。そのため、setParams メソッドを持つ MainController にハンドラーをキャストします。他のすべてのコントローラーは、さまざまな方法で params を使用します。

4

1 に答える 1

1

コントローラーの状態を変更するセッターではなく、params を使用してコントローラー ハンドラー メソッドを呼び出す必要があります。

コントローラーはステートレスまたはスレッドセーフである必要があります。状態を変更すると、セッターがいつ変更を適用するか (別のスレッドでハンドラーが呼び出される前、または後) が保証されません。または、別のスレッドが他のパラメーターでセッターを呼び出し、前のスレッドが新しいパラメーターのハンドラー メソッドを呼び出します。

于 2012-07-10T15:03:08.157 に答える