【问题标题】:Spring 3 Interceptor OrderSpring 3 拦截器顺序
【发布时间】:2016-02-19 22:01:23
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: spring spring-mvc interceptor


    【解决方案1】:

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

    以下是记录拦截器并在运行时查找拦截器的两种方法: org.springframework.web.servlet.handler.AbstractHandlerMapping.initInterceptors()

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

    【讨论】:

    • 非常感谢您的回答。我将模式“/ **”添加到 allInterceptor 并且订单按预期工作。不幸的是,这没有在某处记录,因为它相当违反直觉。好吧,我很高兴它至少记录在这里!
    • 不幸的是对我不起作用:无论我如何放置我的 2 个拦截器(一个是全局的,一个不是,都是非全局的)我无法让 spring 使用第一个,然后其他。我最终将两者合并。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2023-03-17
      • 2018-08-09
      • 2012-03-31
      • 1970-01-01
      • 2014-05-19
      相关资源
      最近更新 更多