Spring 3 Interceptor Order

时间:2012-07-20 20:49:11

标签: spring spring-mvc interceptor

我有一个实现两个拦截器的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之前调用。有谁知道如何控制拦截器被调用的顺序?

谢谢!

2 个答案:

答案 0 :(得分:7)

我查看了底层实现,全局拦截器(与任何路径映射无关)在映射的拦截器之前执行(具有相关的路径模式)。因此,如果您希望在homeInterceptor之前执行allInterceptor,则allInterceptor可能必须成为映射拦截器(通过提供路径模式)。

这两种方法记录拦截器并在运行时找到拦截器: org.springframework.web.servlet.handler.AbstractHandlerMapping.initInterceptors()

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

答案 1 :(得分:3)

在Spring 3中,他们首先删除了执行全局拦截器的逻辑。现在拦截器按声明它们的顺序执行。

但请注意,拦截器的postHandle以REVERSE顺序执行!