spring boot 中设置过滤器的顺序
1. 使用@Order
注解
使用的是Spring框架提供的Filter
(例如,通过继承OncePerRequestFilter
或实现Filter
接口),可以使用@Order
注解来指定过滤器的顺序。@Order
注解可以指定一个整数值,数值越小,过滤器优先级越高,越先执行。
2. 实现Ordered
接口
对于Spring管理的Bean,如果你使用的是实现了Ordered
接口的类(比如自定义的Filter),可以直接在类中实现getOrder()
方法来自定义顺序。
3. 使用FilterRegistrationBean
配置顺序
对于Servlet API的Filter,可以通过配置FilterRegistrationBean
来设置顺序。这通常在配置类中完成。你可以设置order
属性来指定顺序。
4. 使用@ServletComponentScan
和@WebFilter
注解(对于Servlet API Filter)
使用的是基于Servlet API的Filter,并且想要使用注解来配置它,可以使用@WebFilter
注解,并通过在类上添加@ServletComponentScan
来启用扫描。然后你可以在urlPatterns
属性中指定匹配的URL模式,并通过在类上添加@Order
注解来设置顺序。不过,需要注意的是,直接使用@Order
注解在这种情况下可能不起作用,因为它是Spring特有的注解。在这种情况下,通常需要通过实现上面提到的通过配置类使用FilterRegistrationBean
的方式来设置顺序。
@WebFilter注解(Servlet 3.0+)
如果你的项目支持 Servlet 3.0 及以上版本,可以直接在 Filter 类上使用 @WebFilter 注解
@WebFilter(urlPatterns = "/api/*")
public class FirstFilter implements Filter {
// ...
}
在 Spring Boot 启动类上添加 @ServletComponentScan
,使 @WebFilter
生效
@SpringBootApplication @ServletComponentScan // 扫描@WebFilter注解
它们的执行顺序由类名的字母顺序决定(在 @WebFilter 注解中添加 @Order 注解(如 @Order(1))不会生效。因为 @Order 是 Spring 的注解,而 @WebFilter 是 Servlet 原生注解,Spring 不会自动将其顺序应用到 Servlet 容器中)
你可以结合 @WebFilter 和 FilterRegistrationBean 使用,即 FilterRegistrationBean 再覆盖顺序,需要使用其 setOrder
拦截器的配置以及执行顺序
在Spring Boot中,拦截器的执行顺序可以通过InterceptorRegistry对象的addInterceptor()方法按照添加的顺序进行配置。
默认情况下,拦截器的执行顺序是按照它们添加到拦截器注册表中的顺序执行的。也就是说,先添加的拦截器会先执行,后添加的拦截器会后执行
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new FirstInterceptor()) .addPathPatterns("/**") .order(1); // 设置拦截器的执行顺序为1 registry.addInterceptor(new SecondInterceptor()) .addPathPatterns("/**") .order(2); // 设置拦截器的执行顺序为2 } }
- 过滤器的执行顺序
过滤器的执行顺序由其在web.xml配置文件中的顺序决定。当一个请求到达应用程序时,所有的过滤器都会按照其在web.xml中的顺序被调用。过滤器的执行顺序是按照配置顺序从上到下依次执行。 - 拦截器的执行顺序
拦截器的执行顺序由其在Spring配置文件中的顺序决定。在Spring应用程序中,拦截器的配置是通过实现HandlerInterceptor接口来实现的。拦截器的执行顺序是按照配置顺序从上到下依次执行。