Filter(過濾器/攔截器)實現 javax.servlet.Filter 接口,用於在 Servlet 請求處理前後攔截請求/響應,實現編碼設置、權限校驗、日誌記錄等橫切關注點。本文通過示例講解 Filter 基礎用法、鏈調用順序、生命週期與初始化參數獲取。
| 方法 | 調用時機 | 用途 |
|---|---|---|
init(FilterConfig config) | 容器啟動實例化後,僅一次 | 初始化資源,可讀取 <init-param> |
doFilter(req, resp, chain) | 每次請求匹配時 | 核心邏輯,必須調用 chain.doFilter() 傳遞給下一個 Filter 或 Servlet |
destroy() | 容器卸載前,僅一次 | 釋放資源(關閉連接、流等) |
public class MyFilter implements Filter {
public void init(FilterConfig fConfig) {
System.out.println("MyFilter.init()");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
PrintWriter out = resp.getWriter();
out.println("Hello MyFilter");
chain.doFilter(req, resp); // 關鍵:放行
}
public void destroy() {
System.out.println("MyFilter.destroy()");
}
}
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.net.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/Index</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Index</servlet-name>
<servlet-class>com.net.Index</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Index</servlet-name>
<url-pattern>/Index</url-pattern>
</servlet-mapping>

多 Filter 時,調用順序由 <filter-mapping> 在 web.xml 中的聲明順序決定:
<filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/Index</url-pattern> </filter-mapping> <filter-mapping> <filter-name>MyFilter2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
請求流向:Request → MyFilter → MyFilter2 → Servlet
響應流向:Servlet → MyFilter2 → MyFilter → Response


init() 參數 FilterConfig 封裝 web.xml 配置信息:
| 方法 | 說明 |
|---|---|
getFilterName() | Filter 名稱 |
getInitParameter(String name) | 獲取指定初始化參數值 |
getInitParameterNames() | 獲取所有初始化參數名枚舉 |
getServletContext() | 獲取 ServletContext |
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.net.MyFilter</filter-class>
<init-param>
<param-name>like</param-name>
<param-value>java</param-value>
</init-param>
</filter>
public void init(FilterConfig fConfig) {
String filterName = fConfig.getFilterName(); // "MyFilter"
String like = fConfig.getInitParameter("like"); // "java"
System.out.println(filterName + " - " + like);
}
最佳實踐: Servlet 3.0+ 建議使用
@WebFilter註解替代 XML 配置,支持dispatcherTypes精確控制轉發/包含/異步/錯誤請求的攔截。