SpringBoot系列(十二)過濾器配置詳解

SpringBoot(十二)過濾器詳解

往期精彩推薦
SpringBoot系列(一)idea新建Springboot項目html

SpringBoot系列(二)入門知識java

springBoot系列(三)配置文件詳解web

SpringBoot系列(四)web靜態資源配置詳解spring

SpringBoot系列(五)Mybatis整合完整詳細版跨域

SpringBoot系列(六)集成thymeleaf詳解版springboot

Springboot系列(七) 集成接口文檔swagger,使用,測試app

SpringBoot系列(八)分分鐘學會Springboot多種解決跨域方式ide

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 代碼的配置。以後進行測試,與結果展現。若是你以爲本文對你有用,能夠點個關注哦!

相關文章
相關標籤/搜索