8

2つのインターセプターを実装するSpring3Webアプリがあります。@Configurationという注釈の付いた構成クラスを使用しています。コードは次のとおりです。

    @Override
public void addInterceptors(InterceptorRegistry registry) {
    // TODO Auto-generated method stub
    super.addInterceptors(registry);
    registry.addInterceptor(homeInterceptor()).addPathPatterns("/");
    registry.addInterceptor(allInterceptor());
}

レジストリにインターセプターを追加する順序に関係なく、allInterceptorのpreHandle関数は、常にhomeInterceptorのpreHandleの前に呼び出されます。インターセプターが呼び出される順序を制御する方法を知っている人はいますか?

ありがとう!

4

2 に答える 2

7

基礎となる実装を確認しました。グローバルインターセプター(パスマッピングに関連付けられていない)は、マップされたインターセプター(パスパターンに関連付けられている)の前に実行されます。したがって、のhomeInterceptor前にを実行するallInterceptor場合allInterceptorは、(パスパターンを提供することにより)マップされたインターセプターにする必要があります。

これらは、インターセプターを記録し、実行時にインターセプターを見つける2つの方法です。 org.springframework.web.servlet.handler.AbstractHandlerMapping.initInterceptors()

org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandlerExecutionChain(Object, HttpServletRequest)

于 2012-07-21T03:02:19.653 に答える
3

Spring 3では、最初にグローバルインターセプターを実行するロジックが削除されたようです。これで、インターセプターは宣言された順序で実行されます。

ただし、インターセプターのpostHandleはREVERSEの順序で実行されることに注意してください。

于 2016-02-19T14:01:23.767 に答える