Servlet 過濾器是一種實現了 javax.servlet.Filter 介面的 Java 類別,主要用於攔截客戶端請求與伺服器回應,實現請求預處理、回應後處理等横切關注點。常見應用場景包含字元編碼統一、登入驗證、日誌記錄、敏感詞過濾、資料壓縮等。
過濾器由 Web 容器負責實例化與管理,其生命週期包含三個關鍵階段:
init(FilterConfig) 讀取 web.xml 配置參數。doFilter(ServletRequest, ServletResponse, FilterChain),透過 chain.doFilter() 傳遞給下一個過濾器或目標資源。destroy() 釋放資源。圖解展示了請求通過過濾器鏈的完整流程,以及 Dispatcher 模式(REQUEST、FORWARD、INCLUDE、ERROR、ASYNC)對攔截範圍的影響。
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>userFilter</filter-name>
<filter-class>com.wx.login.filter.UserFilter</filter-class>
<init-param>
<param-name>Site</param-name>
<param-value>菜鳥網絡</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>userFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Servlet 3.0+ 支援使用 @WebFilter 註解直接在類別上宣告過濾器,屬性包含 filterName、urlPatterns、initParams、dispatcherTypes 等,容器部署時自動掃描註冊,無需 XML 配置。
多個過濾器按 filter-mapping 定義順序形成鏈,請求依次通過各 doFilter 前置邏輯,到達目標資源後,回應再依逆序通過各 doFilter 後置邏輯。圖示清晰展示了「疊床架屋」式的調用堆疊。