SpringBoot入門到精通系列教程 – Filter/WebFilter

1. Filter簡介

通過Filter技術,對各種資源:例如API, JSP,Servlet,靜態圖片文件或靜態HTML文件進行攔截,從而實現一些特殊功能。如實現token校驗,URL級別的許可權控制、過濾敏感辭彙、額外記錄日誌、壓縮響應資訊等一些高級功能。

1.1. SpringBoot 中Filter的作用

  • 在request被處理前,預處理,或者修改request。比如,所有的api都要做鑒權處理,通過後才會被業務邏輯處理,這部分邏輯就可以卸載Filter中。
  • 修改一個response,比如附加一些額外的資訊再返回給Client。
  • 可以定義多個Filter,並指定執行的順序。

1.2. @WebFilter

Servlet3+ 額外增加的WebFilter注釋, 方便處理Web應用中的場景。

2. 基於@WebFilter的實現

環境:

  • Java 1.8.0_05
  • Spring Boot: 2.4.1
  • IDE: Intellj IDEA 2020.3

2.1. SpringbootApplication方法上加上啟動掃描

@ServletComponentScan
@SpringBootApplication
public class TodoApiApplication {
    // ... ...
}

2.2. 新建Filter

@WebFilter(filterName = "AuthFilter", urlPatterns = {"/todo-api/v1/tasks/*", "/todo-api/v1/order/*"})
@Order(1)
public class AuthFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;

        // 預處理 Request
        // "Request - "+ request.getMethod() + ":"+ request.getRequestURI()
        // ... ...

        // 最後,讓其他servlet或者Filter繼續處理
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

2.3. 關於WebFilter

  1. Order(x) 裡面的x數值越小優先順序越高
  2. 根據需要,可以重載init,destroy方法
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("過濾器創建");
    }

    @Override
    public void destroy() {
        System.out.println("過濾器銷毀");
    }

3. 總結

Filter (@WebFilter) 用於攔截Web請求,進行預處理,或者修改Response再返回給客戶端。

———- END ———-