簡介
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網站進行壓縮。