springBoot配置多个过滤器filter的执行顺序
1、自定义过滤器
过滤器类实现 javax.servlet.Filter。然后添加注解 @WebFilter(filterName=“过滤器名称” urlPatterns=“过滤规则” )
@Order(int) 注解,配合 @WebFilter 注解使用,用于多个过滤器时定义执行顺序,值越小越先执行。
2、添加 @ServletComponentScan 注解
在启动类上加一个注解 @ServletComponentScan(basePackages=“需要扫描的过滤器”)
3、多个过滤器如何指定执行顺序?
使用@Order注解指定一个int值,越小越先执行。很多博客文章都是这么说的,但你真正的试了吗?真的可以使用这个注解指定顺序吗?答案是否定的。
经过测试,发现 @Order 注解指定 int 值没有起作用,是无效的。为啥?因为看源码发现 @WebFilter 修饰的过滤器在加载时,没有使用 @Order 注解,而是使用的类名来实现自定义Filter顺序
所以这种方式下想定义Filter的顺序,就必须限定 Filter 的类名,比如刚才那个 Filter 叫 Filter01,假如我们现在新写了一个 Filter 叫 Filter02,那么顺序就是 Filter01> Filter02。
所以这种方式虽然实现起来简单,只需要注解,但自定义顺序就必须要限定类名,使用类名达到排序效果了。
4、配置多个过滤器的执行顺序
@Configuration
public class FilterConfig{
@Bean
public FilterRegistrationBean Filter01(){
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
filterRegistrationBean.setFilter(new Filter01());//设置过滤器名称
filterRegistrationBean.addUrlPatterns("/*");//配置过滤规则
filterRegistrationBean.setOrder(1); //order的数值越小 则优先级越高
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean Filter02(){
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
filterRegistrationBean.setFilter(new Filter02());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.setOrder(2);
return filterRegistrationBean;
}
}