SpringBoot:過濾器設定詳解

2020-10-16 12:00:20

一、過濾器簡介

1、過濾器是什麼?

Filter也稱之為過濾器,過濾器是對資料進行過濾,預處理。開發人員可以對使用者端提交的資料進行過濾處理,比如敏感詞,也可以對伺服器端返回的資料進行處理。還有就是可以驗證使用者的登入情況,許可權驗證,對靜態資源進行存取控制,沒有登入或者是沒有許可權時是不能讓使用者直接存取這些資源的。類似的過濾器還有很多的功能,比如說編碼,壓縮伺服器端給使用者端返回的各種資料,等等。

2、過濾器的運作原理?

java為我們提供了一個Filter介面,我們只需要實現這個介面就能實現自定義過濾器,然後新增一些必要的設定讓過濾器生效。過濾器只能初始化一次,並且過濾器只會在專案停止或者是重新部署的時候才銷燬。我們可以實現的這個Filter介面,裡面最重要的是一個doFilter方法,當我們編寫好Filter,並設定好對那個URL資源進行攔截時,每一次請求這個資源之前就會呼叫這個doFilter方法。並且在這個doFilter方法裡面也有著一個FilterChain的物件引數 ,這個物件裡面也有一個doFilter方法,是否呼叫這個方法決定了這個過濾器是否能呼叫後面的資源或者是執行後面的過濾器。也就是相當於目標資源。所以在過濾器裡面可以進行一些什麼操作呢?可以在呼叫目標資源之前,進行許可權等的處理;判斷是否呼叫目標資源;也可以在呼叫目標資源之後進行一些響應訊息進行處理。

二、過濾器設定的兩種方法

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 程式碼的設定。之後進行測試,與結果展示。

結語:

SpringBoot是現在用的很廣泛的框架,基本上學Java、軟體開發的都會學到,工作中也都會用到,但是技術是需要不斷提升的,不只是要會用,還要懂。我這有免費的各種框架學習資料,還有教學,只要是工作中會要用到的點,都有。有需要的小夥伴可以點選進入,暗號:csdd,免費提供!
在這裡插入圖片描述

在這裡插入圖片描述