如何使多个 Spring HandlerInterceptor 以特定顺序执行

Posted

技术标签:

【中文标题】如何使多个 Spring HandlerInterceptor 以特定顺序执行【英文标题】:How to make multiple Spring HandlerInterceptors execute in a specific order 【发布时间】:2021-10-25 02:42:35 【问题描述】:

我目前正在开发一个 Spring Boot 项目。我依赖于一个库项目,该库项目有一个拦截器(LibraryProjectInterceptor.java)和一个public class LibraryProjectConfig implements WebMvcConfigurer,并覆盖addInterceptors() 方法以将LibraryProjectInterceptor 添加到InterceptorRegistry。在我添加此库项目依赖项的实际项目中,我创建了一个拦截器(ActualProjectInterceptor),需要在执行LibraryProjectInterceptor 之后执行。我尝试将@Order(value = Ordered.LOWEST_PRECEDENCE) 添加到ActualProjectInterceptor 以使其在LibraryProjectInterceptor 之后执行,但它不起作用。谁能帮帮我

图书馆项目:

public class LibraryProjectInterceptor implements HandlerInterceptor 
 ......





  @Configuration
  @EnableWebMVC
  public class LibraryProjectConfig implements WebMvcConfigurer 
    ......
        @Override
            public void addInterceptors(InterceptorRegistry registry) 
                registry.addInterceptor(LibraryProjectInterceptor);
            
    ......
    

实际项目: pom.xml

 ......

<dependencies>
 <dependency> 
   <groupId>com.example</groupId>
   <artifactId>library-project</artifactId>
   <version>1.0.16</version>
 </dependency>
 ......

@Component
@Order(value = Ordered.LOWEST_PRECEDENCE)
public class ActualProjectInterceptor implements HandlerInterceptor
.......


@SpringBootApplication
public class ActualProjectConfig implements WebMvcConfigurer 
......
    @Override
        public void addInterceptors(InterceptorRegistry registry) 
            registry.addInterceptor(ActualProjectInterceptor);
        
......

【问题讨论】:

【参考方案1】:

试试这个,我希望它会工作。

@Component
public class ActualProjectInterceptor implements HandlerInterceptor 

@SpringBootApplication
public class ActualProjectConfig implements WebMvcConfigurer 

    @Override
    public void addInterceptors(InterceptorRegistry registry) 
        registry.addInterceptor(ActualProjectInterceptor)
                .order(Ordered.LOWEST_PRECEDENCE);
    

addInterceptor() 方法创建 InterceptorRegistration DSL 对象,该对象具有 order() 方法来指定您需要的内容。

【讨论】:

嘿。谢啦!有效。我想知道为什么 @Order 注释不起作用。你能解释一下吗 如果没有看到实际的代码库registry.addInterceptor(ActualProjectInterceptor) -> ActualProjectInterceptor,我无法回答这个名称是对 Spring Bean 的引用,或者您使用了 new 运算符来创建对象。如果是第二个选项,我认为@Order 将不起作用,因为它与 Spring 引擎密切相关,创建一个作为序数 bean 的类(没有 Spring 支持)可能是根本原因。 是的!我认为你是对的。 'LibraryProjectInterceptor' 是使用 'new' 运算符添加到注册表中的 registry.addInterceptor(new LibraryProjectInterceptor());

以上是关于如何使多个 Spring HandlerInterceptor 以特定顺序执行的主要内容,如果未能解决你的问题,请参考以下文章

在Spring中使用多个HttpSessionIdResolver。

Spring是如何运用设计模式的?

Spring:如何使路由与页面上的 URL 保持同步?

spring-boot redis:如何使用户的所有会话无效?

即使数据库已关闭,如何使 Spring 服务器启动?

如何使用基本身份验证保护 Spring Cloud Eureka 服务?