首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Servlet Filter 過濾器完整指南:生命周期、鏈式調用、web.xml 配置與實戰模式

     編輯:Java 程式設計入門

Filter 接口三大方法

doFilter 核心參數

  • ServletRequest/Response:可向下轉型 HttpServletRequest/Response
  • FilterChain:chain.doFilter(req, res) 傳遞給下一個 Filter 或目標 Servlet/JSP

執行流程圖解

請求 → Filter1.doFilter → chain.doFilter → Filter2.doFilter → chain.doFilter → Servlet.service
                    ↑                                              ↓
響應 ← Filter1 繼續執行 ← chain.doFilter 返回 ← Filter2 繼續執行 ← Servlet 返回

**關鍵點**:chain.doFilter **前**為預處理,**後**為後處理;**不調用**即攔截阻斷,Filter 需自行輸出響應。

web.xml 註冊配置

<filter>
  <filter-name>EncodingFilter</filter-name>
  <filter-class>com.example.EncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>EncodingFilter</filter-name>
  <url-pattern>/*</url-pattern> <!-- 或 <servlet-name>xxx</servlet-name> -->
  <dispatcher>REQUEST</dispatcher> <!-- 默認 REQUEST,可加 FORWARD/INCLUDE/ERROR -->
</filter-mapping>

實戰模式

方法調用時機典型用途
init(FilterConfig)容器啟動、Filter 首次加載讀取初始化參數、建立連接池、載入配置
doFilter(req, res, chain)每次請求匹配時編碼設置、登錄校驗、日誌記錄、XSS 清洗、壓縮響應
destroy()容器關閉、Filter 卸載關閉資源、釋放連接池、持久化狀態

Spring Boot 註解式註冊

@WebFilter(urlPatterns = "/*", initParams = @WebInitParam(name="encoding", value="UTF-8"))
public class EncodingFilter implements Filter { ... }
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式場景代碼片段
統一編碼解決 POST 亂碼req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8");
登錄攔截保護後台路徑if (session.getAttribute("user")==null) resp.sendRedirect("/login"); else chain.doFilter(...);
請求日誌記錄 IP、URL、耗時long start=System.currentTimeMillis(); chain.doFilter(...); log.info("cost="+(System.currentTimeMillis()-start));
響應包裝GZIP 壓縮、內容替換HttpServletResponseWrapper 重寫 getOutputStream/getWriter