Java之Filter過濾器

簡介

    filter過濾器主要使用於前臺向後臺傳遞數據的過濾操作。通過Filter技術,開發人員可以實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截。簡單說,就是可以實現web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲進行處理。

Filter工作原理

    過濾器可以有多個稱之爲過濾鏈FilterChain,服務器會按照web.xml中過濾器定義的先後循序執行。過濾器通過chain.doFilter()決定是否繼續執行。 在過濾器中,可以攔截請求,判斷請求是否滿足過濾規則,對滿足過濾規則的請求進行修改(如,統一設置編碼格式)或者決定是否繼續執行下面的操作(如,判斷用戶是否登錄)。


Filter使用步驟

1、新建一個類,實現javax.serlvet.filter接口

    Filter中有三個方法:

    A.void  init(FilterConfig config) //設置filter 的配置對象;

    b.void destory() //銷燬filter對象;

    c.void doFilter(ServletRequestreq,ServletResponse res,FilterChain chain) //執行filter 的工作。

    doFilter方法中,過濾器可以對請求和響應做它想做的一切,通過調用他們的方法收集數據,或者給對象添加新的行爲。Filter通過調用chain.doFilter()將控制權傳送給下一個過濾器,如果過濾器想要終止請求的處理或得到對響應的完全控制,則可以不調用下一個過濾器,而將其重定向至其它一些頁面。當鏈中的最後一個過濾器調用chain.doFilter()方法時,將運行最初請求的Servlet。

2、在Web.xml中進行配置(配置和Servlet類似)

    配置標籤:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><filter>

    <filter-name>myFilter</filter-name>         <!--Filter的名稱-->

    <filter-class>***.MyFilter</filter-class>     <!--Filter的包路徑-->

</filter>

<filter-mapping>

    <filter-name>myFilter</filter-name>  <!--此處的Filter名稱和上面的一樣-->

    <url-pattern>/*</url-pattern>      <!--指定攔截url匹配的資源-->

    <servlet-name>目標資源</servlet-name>        <!--指定攔截指定的servlet-->

    <dispatcher>REQUEST</dispatcher>             <!--指定過濾器所攔截的資源被 Servlet 容器調用的方式-->

</filter-mapping></span>

url-pattern標籤詳解:

    a、精確匹配,不用任何修飾符

      例如:<url-pattern>/servlet/TestServlet</url-pattern> 

    b、擴展匹配:*.擴展名

      例如:<url-pattern>*.jsp</url-pattern> 

    c、路徑前綴匹配:目錄/*

      例如:<url-pattern>/servlet/*</url-pattern> 

    d、全部匹配:/*

      例如:<url-pattern>/*</url-pattern>

Dispatcher標籤詳解:

    指定過濾器所攔截的資源被Servlet容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認REQUEST。用戶可以設置多 個<dispatcher> 子元素用來指定 Filter 對資源的多種調用方式進行攔截。
a、REQUEST:
    當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問或ERROR情況時,那麼該過濾器就不會被調用。
b、INCLUDE:
    如果目標資源是通過RequestDispatcher的include()方法訪問時,那麼該過濾器將被調用。除此之外,該過濾器不會被調用。
c、FORWARD:
    如果目標資源是通過RequestDispatcher的forward()方法訪問時,那麼該過濾器將被調用,除此之外,該過濾器不會被調用。
d、ERROR:
    如若在A.jsp頁面page指令中指定了error屬性爲examError.jsp,那麼A.jsp中若出現了異常,會跳轉到examError.jsp中處理。而在跳轉到examError.jsp時,若過濾器配置了ERROR的dispather那麼則會攔截,否則不會攔截。此功能類似error-page應用。

Filter使用場景

Filter的使用情況分爲三種:
   1>
通過控制對chain.doFilter的方法的調用,來決定是否需要訪問目標資源。如,用戶權限限制。
   2>
通過在調用chain.doFilter方法之前,做些處理來達到某些目的。如,設置編碼格式。
   3>
通過在調用chain.doFilter方法之後,做些處理來達到某些目的。如,對整個web網站進行壓縮。

常用Filter代碼分享


發佈了129 篇原創文章 · 獲贊 18 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章