SpringBoot(十二)過濾器詳解 往期精彩推薦 "SpringBoot系列(一)idea新建Springboot項目" "SpringBoot系列(二)入門知識" "springBoot系列(三)配置文件詳解" "SpringBoot系列(四)web靜態資源配置詳解" "SpringBoot系 ...
SpringBoot(十二)過濾器詳解
往期精彩推薦
SpringBoot系列(一)idea新建Springboot項目
Springboot系列(七) 集成介面文檔swagger,使用,測試
SpringBoot系列(八)分分鐘學會Springboot多種解決跨域方式
SpringBoot系列(十)優雅的處理統一異常處理與統一結果返回
SpringBoot系列(十一)攔截器與攔截器鏈的配置與使用詳解,你知道多少?
目錄
1. 過濾器簡介
1. 過濾器是什麼?
Filter也稱之為過濾器,過濾器是對數據進行過濾,預處理。開發人員可以對客戶端提交的數據進行過濾處理,比如敏感詞,也可以對服務端返回的數據進行處理。還有就是可以驗證用戶的登錄情況,許可權驗證,對靜態資源進行訪問控制,沒有登錄或者是沒有許可權時是不能讓用戶直接訪問這些資源的。類似的過濾器還有很多的功能,比如說編碼,壓縮服務端給客戶端返回的各種數據,等等。
2. 過濾器的運作原理?
過濾器這麼牛逼,那麼它的運作原理是什麼呢?
java為我們提供了一個Filter介面,我們只需要實現這個介面就能實現自定義過濾器,然後添加一些必要的配置讓過濾器生效。過濾器只能初始化一次,並且過濾器只會在項目停止或者是重新部署的時候才銷毀。我們可以實現的這個Filter介面,裡面最重要的是一個doFilter方法,當我們編寫好Filter,並配置好對那個URL資源進行攔截時,每一次請求這個資源之前就會調用這個doFilter方法。並且在這個doFilter方法裡面也有著一個FilterChain的對象參數 ,這個對象裡面也有一個doFilter方法,是否調用這個方法決定了這個過濾器是否能調用後面的資源或者是執行後面的過濾器。也就是相當於目標資源。所以在過濾器裡面可以進行一些什麼操作呢?可以在調用目標資源之前,進行許可權等的處理;判斷是否調用目標資源;也可以在調用目標資源之後進行一些響應消息進行處理。
2. 過濾器配置的兩種方法
1. 註解配置
首先我們定義一個MyFilter 實現Filter介面。重寫裡面的三個方法
@Order(1)
@WebFilter(filterName = "myFilter1",urlPatterns = {"/*"})
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化過濾器");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("進入目標資源之前先乾點啥");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("處理一下服務端返回的response");
}
@Override
public void destroy() {
System.out.println("過濾器被銷毀了");
}
代碼說明:
1.@WebFilter註解,filterName屬性表示filter的名稱,urlPatter表示要攔截的URL資源,可以是一個或者多個。
2.@Order(1)表示如果有多個攔截器的話就是設置這個攔截器的運行等級,數字越小,越先執行
3.init()方法只會執行一次,初始化過濾器。
4.doFilter()核心方法,配置過濾器的邏輯代碼。
5.destroy()只會在項目停止或者是項目重新部署的時候才會執行。
配置完上面的之後我們還需要在啟動類加上一個掃描包的註解,開啟包掃描。@ServletComponentScan("com.example.demofilter.filter"),當然你也可以不用寫包的具體地址,不傳參數,但是建議是傳參數,並且這個採參數也可以傳多個的。
以上就完成了一個Filter的基本配置,運行項目即可看到效果,還有一種非註解形式的配置方式。
2. java配置
我們可以通過自己定義一個java配置文件,將自定義的Filter 註冊到到FilterRegistrationBean裡面。
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean registFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.setName("Filter1");
registrationBean.setOrder(1);
return registrationBean;
}
}
這個配置和上面的註解配置類似。上面註解實現的原理也是這樣的,雖然是兩種不同的方法,但是是一樣的原理。
3. 測試編寫與結果
controller代碼編寫
@RestController
@RequestMapping("/Filter")
public class FilterController {
@RequestMapping("/testFilter")
public String testFilter(){
System.out.println("filter執行成功");
return "filter";
}
}
完成之後啟動項目,訪問介面:localhost:8098/Filter/testFilter,觀察控制台運行結果。
根據之前我們說的,過濾器只會執行一次,然後過濾器也只會在項目停止或者是重新部署的時候才會銷毀,所以我們是看不到銷毀的代碼輸出出來。
4. 總結
本文先講解了過濾器的一些概念,用途,然後詳細講解了過濾器的在SpringBoot中的配置與使用,我們介紹了兩種配置方法,分別是註解方式與java 代碼的配置。之後進行測試,與結果展示。如果你覺得本文對你有用,可以點個關註哦!