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接口来实现的。拦截器的执行顺序是按照配置顺序从上到下依次执行。


浙公网安备 33010602011771号