1. 程式人生 > >Filter(一)

Filter(一)

con filter throws ges light 高級 開發人員 override cati

Filter

先把Filter的基礎知識繪制成思維導圖的形式,便於記憶

技術分享

一、Filter簡介:

Filter又稱為過濾器,就是實現瀏覽器與服務器之間的過濾問題,作用是在瀏覽器的請求在到達WEB資源(HTML、CSS、Servlet、JSP)之前進行攔截。然後能夠進行一些操作:例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息等一些高級功能。

Filter 的作用:

1.Filter可以在請求到達目標資源之前進行攔截 2.Filter也可以放行請求 3.Filter可以在響應到達瀏覽器之前做一個預處理

技術分享

二、Filter的實現原理

    也就是Filter是怎麽實現攔截的?

因為Filter是實現Filter接口,而該接口會提供一個doFilter方法;當創建好Filter類後,實現doFilter方法,在web-xml文件中部署好Filter後,每當瀏覽器向服務器發送請求時,在調用service方法之前都會執行doFilter方法,這時候就可以對網頁進行一些過濾和其他的操作;也就是說Filter就像一個門口的保安一樣,在你進入小區之前會核實你的身份,如果允許進入就同行,不是本小區的陌生人,就可能讓你先登個記在讓你進(同行前進行一些操作),出來的時候可能還需要在登個記(放行之後的操作),如果是黑名單上的人就不允許進入。

這就是Filter的功能(在doFilter中實現):

訪問目標資源前進行一些操作

是否允許調用目標資源(是否放行)

調用目標資源後的一些操作

三、Filter類的創建

3.1使用Filter的步驟

1.編寫Java類實現Filter接口,並實現doFilter方法;

2.在web-xml文件中進行配置

1).Java的實現範例

public class myFilter implements Filter{
	@Override
	public void init(FilterConfig arg0) throws ServletException {//初始化方法
		System.out.println("init初始化");		
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {  //doFilter方法
		System.out.println("放行前");
		System.out.println("doFilter");	
		chain.doFilter(request, response);//放行
		System.out.println("放行後");
	}
	@Override
	public void destroy() {//銷毀方法
		System.out.println("destroy銷毀");
	}
}

2)web-xml文件的配置代碼

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>web-filter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 註冊過濾器 -->
  <filter>
      <!-- 註冊過濾器的名,程序員在程序中使用 -->
  	<filter-name>myFilter</filter-name>
  	 <!-- 配置類,給程序使用,程序識別class類 -->
  	<filter-class>com.deuedu.filter.myFilter</filter-class>
  </filter>
  <!-- 映射過濾器 -->
  <filter-mapping>
     <!-- 映射過濾器,能夠通過這個找到註冊過濾器名,所以這兩個名要一致 -->
  	<filter-name>myFilter</filter-name>
  	<!-- 攔截的請求 -->
  	<url-pattern>/1.jsp</url-pattern>
  </filter-mapping>
</web-app>

四、Filter的部署

就是上述在web-xml進行配置的過程,兩步:1是註冊Filter,2是映射Filter

1)、註冊Filter

<!-- 註冊過濾器 -->
  <filter>
      <!-- 註冊過濾器的名,程序員在程序中使用 -->
  	<filter-name>myFilter</filter-name>
  	 <!-- 配置類,給程序使用,程序識別class類 -->
  	<filter-class>com.deuedu.filter.myFilter</filter-class>
  </filter>

當然可以在註冊的時候添加參數,通過init-param來實現

 <!-- 註冊過濾器 -->
  <filter>
      <!-- 註冊過濾器的名,程序員在程序中使用 -->
  	<filter-name>myFilter</filter-name>
  	 <!-- 配置類,給程序使用,程序識別class類 -->
  	<filter-class>com.deuedu.filter.myFilter</filter-class>
    <init-param>
 7        <description>初始化參數</description>
 8        <param-name>name</param-name>
 9        <param-value>孫悟空</param-value>
10   </init-param>
  </filter>

<description>用於添加描述信息,該元素的內容可為空,<description>可以不配置。

  <filter-name>用於為過濾器指定一個名字,該元素的內容不能為空。
  <filter-class>元素用於指定過濾器的完整的限定類名。
  <init-param>元素用於為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數。如果過濾器不需要指定初始化參數,那麽<init-param>元素可以不配置。

2)映射Filter

<!-- 映射過濾器 -->
  <filter-mapping>
     <!-- 映射過濾器,能夠通過這個找到註冊過濾器名,所以這兩個名要一致 -->
  	<filter-name>myFilter</filter-name>
  	<!-- 攔截的請求 -->
  	<url-pattern>/1.jsp</url-pattern>
  </filter-mapping>

<filter-mapping>元素用於設置一個 Filter 所負責攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑
  <filter-name>子元素用於設置filter的註冊名稱。該值必須是在<filter>元素中聲明過的過濾器的名字
  <url-pattern>設置 filter 所攔截的請求路徑(過濾器關聯的URL樣式)
  <servlet-name>指定過濾器所攔截的Servlet名稱。
  <dispatcher>指定過濾器所攔截的資源被 Servlet 容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認REQUEST。用戶可以設置多個<dispatcher> 子元素用來指定 Filter 對資源的多種調用方式進行攔截。

  1. REQUEST:當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時,那麽該過濾器就不會被調用。
  2. INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時,那麽該過濾器將被調用。除此之外,該過濾器不會被調用。
  3. FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時,那麽該過濾器將被調用,除此之外,該過濾器不會被調用。
  4. ERROR:如果目標資源是通過聲明式異常處理機制調用時,那麽該過濾器將被調用。除此之外,過濾器不會被調用

3)

url-pattern的設置規則

1.精確匹配:只有當目標資源的地址和url-pattern的地址一模一樣時,Filter才會攔截資源 例子:/2.jsp , 只有當瀏覽器訪問項目根目錄下的2.jsp時,才會調用Filter 2.路徑匹配:當訪問的資源在url-pattern配置的路徑下時,Filter就會攔截資源。 例子1:/hello/* , 只要訪問項目根目錄下hello下的資源,就會調用Filter。 例子2:/* , 會攔截項目根目錄下所有資源 3.後綴匹配:只要訪問的資源地址和url-pattern的後綴一樣就會調用Filter 例子:*.jsp 只要是以jsp結尾的請求都會攔截

五、Filter生命周期

1.Filter的創建

Filter的創建和銷毀由WEB服務器負責。 web 應用程序啟動時,web 服務器將創建Filter 的實例對象,並調用其init方法,完成對象的初始化功能,從而為後續的用戶請求作好攔截的準備工作filter對象只會創建一次(單例模式),init方法也只會執行一次。通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。

2、Filter的銷毀

Web容器調用destroy方法銷毀Filter。destroy方法在Filter的生命周期中僅執行一次。在destroy方法中,可以釋放過濾器使用的資源。

六、Filter鏈

在一個web應用中,可以開發編寫多個Filter,這些Filter組合起來稱之為一個Filter鏈。web服務器根據Filter在web.xml文件中的註冊順序,決定先調用哪個Filter,當第一個Filter的doFilter方法被調用時,web服務器會創建一個代表Filter鏈的FilterChain對象傳遞給該方法。在doFilter方法中,開發人員如果調用了FilterChain對象的doFilter方法,則web服務器會檢查FilterChain對象中是否還有filter,如果有,則調用第2個filter,如果沒有,則調用目標資源。

多個Filter的執行順序,有filter-mapping標簽的配置順序決定, filter-mappint靠前,則filter先執行,靠後則後執行。

Filter(一)