springBoot配置多个过滤器filter的执行顺序

1、自定义过滤器

过滤器类实现 javax.servlet.Filter。然后添加注解 @WebFilter(filterName=“过滤器名称” urlPatterns=“过滤规则” )
@Order(int) 注解,配合 @WebFilter 注解使用,用于多个过滤器时定义执行顺序,值越小越先执行。

2、添加 @ServletComponentScan 注解

在启动类上加一个注解 @ServletComponentScan(basePackages=“需要扫描的过滤器”)

3、多个过滤器如何指定执行顺序?

使用@Order注解来设置过滤器的执行顺序,是无效的!

使用@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;
	}

}

你可能感兴趣的:(过滤器,filter)