| 方法 | 調用時機 | 典型用途 |
init(FilterConfig) | 容器啟動、Filter 首次加載 | 讀取初始化參數、建立連接池、載入配置 |
doFilter(req, res, chain) | 每次請求匹配時 | 編碼設置、登錄校驗、日誌記錄、XSS 清洗、壓縮響應 |
destroy() | 容器關閉、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>
實戰模式
| 模式 | 場景 | 代碼片段 |
| 統一編碼 | 解決 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 |
Spring Boot 註解式註冊
@WebFilter(urlPatterns = "/*", initParams = @WebInitParam(name="encoding", value="UTF-8"))
public class EncodingFilter implements Filter { ... }
- 上一篇文章: 為什麼重寫 equals 必須重寫 hashCode?契約、哈希表原理與最佳實踐
- 下一篇文章: Java == 與 equals 區別深度解析:字符串驗證、Object 默認實現與重寫規範
Copyright ©
程式碼之家 All Rights Reserved