spring boot 中设置过滤器的顺序

1. 使用@Order注解

 使用的是Spring框架提供的Filter(例如,通过继承OncePerRequestFilter或实现Filter接口),可以使用@Order注解来指定过滤器的顺序。@Order注解可以指定一个整数值,数值越小,过滤器优先级越高,越先执行。

@Component
@Order(1) // 设置顺序为1
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤逻辑
chain.doFilter(request, response);
}
}
 

2. 实现Ordered接口

对于Spring管理的Bean,如果你使用的是实现了Ordered接口的类(比如自定义的Filter),可以直接在类中实现getOrder()方法来自定义顺序。

@Component
public class MyFilter implements Filter, Ordered {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤逻辑
chain.doFilter(request, response);
}
 
@Override
public int getOrder() {
return 1; // 设置顺序为1
}
}
 

3. 使用FilterRegistrationBean配置顺序

对于Servlet API的Filter,可以通过配置FilterRegistrationBean来设置顺序。这通常在配置类中完成。你可以设置order属性来指定顺序。

@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyServletFilter> loggingFilter() {
FilterRegistrationBean<MyServletFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyServletFilter()); // 你的Servlet Filter实现
registrationBean.setOrder(1); // 设置顺序为1
registrationBean.addUrlPatterns("/*"); // 设置匹配的URL模式
return registrationBean;
}
}

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
    }
}

    1. 过滤器的执行顺序
      过滤器的执行顺序由其在web.xml配置文件中的顺序决定。当一个请求到达应用程序时,所有的过滤器都会按照其在web.xml中的顺序被调用。过滤器的执行顺序是按照配置顺序从上到下依次执行。
    2. 拦截器的执行顺序
      拦截器的执行顺序由其在Spring配置文件中的顺序决定。在Spring应用程序中,拦截器的配置是通过实现HandlerInterceptor接口来实现的。拦截器的执行顺序是按照配置顺序从上到下依次执行。
posted @ 2025-06-16 13:55  KLAPT  阅读(275)  评论(0)    收藏  举报