1、過濾器(Filter)的介紹
Spring Boot 的過濾器用于對數據進行過濾處理。通過 Spring Boot 的過濾器,程序開發人員不僅可以對用戶通過 URL 地址發送的請求進行過濾處理(例如:過濾一些錯誤的請求或者請求中的敏感詞等),而且可以對服務器返回的數據進行過濾處理(例如:壓縮響應信息等)。
在 Web 服務器中部署了過濾器以后,不僅客戶端發送的請求會經過過濾器的處理,而且請求在發送到目標資源處理以后,請求的回應信息也同樣要經歷過濾器。如果一個 Web 應用中使用一個過濾器不能解決實際中的業務需要,那么可以部署多個過濾器對業務請求進行多次處理,這樣做就組成了一個過濾器鏈。Web 服務器在處理過濾器鏈時,將按過濾器的先后順序對請求進行處理。
2、過濾器(Filter)的核心對象
過濾器對象放置在javax.servlet包中,其名稱為Filter,它是一個接口。除這個接口外,與過濾器相關的對象還有FilterConfig對象與FilterChain對象,這個兩個對象也同樣是接口對象,位于javax.servlet包中,分別為過濾器的配置對象與過濾器的傳遞工具。
在實際開發中,定義過濾器對象只需要直接或間接地實現Filter接口即可。如上圖所示中的MyFilter1過濾器與MyFilter2過濾器,而FilterConfig對象與FilterChain對象用于對過濾器的相關操作。
2.1 Filter 接口
每一個過濾器對象都要直接或間接地實現Filter接口,在Filter接口中定義了3個方法,其方法聲明及說明如下表:
Filter 接口的方法聲明及說明:
方法聲明 | 說明 |
---|---|
public default void init(FilterConfig filterConfig) throws ServletException | 過濾器初始化方法,該方法在過濾器初始化時調用。 |
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException | 對請求進行過濾處理。 |
public default void destroy() | 銷毀方法,以便釋放資源。 |
2.2 FilterConfig 接口
FilterConfig接口由Servlet容器進行實現,主要用于獲取過濾器中的配置信息,其方法聲明及說明如下表:
FilterConfig接口的方法聲明及說明:
方法聲明 | 說明 |
---|---|
public String getFilterName() | 用于獲取過濾器的名字。 |
public ServletContext getServletContext() | 獲取Servlet上下文。 |
public String getInitParameter(String name) | 獲取過濾器的初始化參數值。 |
public Enumeration<String> getInitParameterNames() | 獲取過濾器的所有初始化參數。 |
2.3 FilterChain 對象
FilterChain對象仍然有Servlet容器進行實現,在這個接口中只有一個方法,其方法聲明如下:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{// 向下傳遞過濾器chain.doFilter(request, response);
}
該方法用于將過濾后的請求傳遞給下一個過濾器,如果此過濾器已經是過濾器鏈中的最后一個過濾器,那么,請求將傳送給目標資源。
【示例】創建一個過濾器,實現網站訪問計數器的功能。
package com.pjb.filter;import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;import java.io.IOException;/*** 計算器過濾器* @author pan_junbiao**/
public class CountFilter implements F