如何使多个 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。