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

Java Web Filter 過濾器原理、鏈機制與生命週期詳解

     編輯:Java 綜合教學

Java Web Filter 過濾器原理、鏈機制與生命週期詳解

Filter(過濾器/攔截器)實現 javax.servlet.Filter 接口,用於在 Servlet 請求處理前後攔截請求/響應,實現編碼設置、權限校驗、日誌記錄等橫切關注點。本文通過示例講解 Filter 基礎用法、鏈調用順序、生命週期與初始化參數獲取。

Filter 接口三大方法

方法調用時機用途
init(FilterConfig config)容器啟動實例化後,僅一次初始化資源,可讀取 <init-param>
doFilter(req, resp, chain)每次請求匹配時核心邏輯,必須調用 chain.doFilter() 傳遞給下一個 Filter 或 Servlet
destroy()容器卸載前,僅一次釋放資源(關閉連接、流等)

第一個 Filter 示例

MyFilter.java

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()");
    }
}

web.xml 配置

<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>

測試結果

輸出 Hello MyFilter 及 Index

Filter 鏈調用順序

多 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

Filter 鏈示意圖

雙 Filter 測試輸出

生命週期與 FilterConfig

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 精確控制轉發/包含/異步/錯誤請求的攔截。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved