天天看點

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

}