8

我有一个实现两个拦截器的 Spring 3 Web App。我使用了一个带有 @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可能必须将 设为映射拦截器(通过提供路径模式)。

这是记录拦截器并在运行时查找拦截器的两种方法: 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 回答