簡述過濾器

過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在服務器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。在這之後,過濾器可以作如下的選擇:
1、 以常規的方式調用資源(即,調用servlet或JSP頁面)。
2、利用修改過的請求信息調用資源。
3、 調用資源,但在發送響應到客戶機前對其進行修改
4、阻止該資源調用,代之以轉到其他的資源,返回一個特定的狀態代碼或生成替換輸出。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1. 建立基本過濾器
建立一個過濾器涉及下列五個步驟:
1)建立一個實現Filter接口的類。這個類需要三個方法,分別是:doFilter、init和destroy。doFilter方法包含主要的過濾代碼(見第2步),init方法建立設置操作,而destroy方法進行清楚。
2)在doFilter方法中放入過濾行爲。doFilter方法的第一個參數爲ServletRequest對象。此對象給過濾器提供了對進入的信息(包括表單數據、cookie和HTTP請求頭)的完全訪問。第二個參數爲ServletResponse,通常在簡單的過濾器中忽略此參數。最後一個參數爲FilterChain,如下一步所述,此參數用來調用servlet或JSP頁。
3)調用FilterChain對象的doFilter方法。Filter接口的doFilter方法取一個FilterChain對象作爲它的一個參數。在調用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活。
4)對相應的servlet和JSP頁面註冊過濾器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
5)禁用激活器servlet。防止用戶利用缺省servlet URL繞過過濾器設置。

 

1.1 建立一個實現Filter接口的類
所有過濾器都必須實現javax.servlet.Filter。這個接口包含三個方法,分別爲doFilter、init和destroy。
public void doFilter(ServletRequset request,
ServletResponse response,
FilterChain chain)
thows ServletException, IOException
每當調用一個過濾器(即,每次請求與此過濾器相關的servlet或JSP頁面)時,就執行其doFilter方法。正是這個方法包含了大部分過濾邏輯。
第一個參數爲與傳入請求有關的ServletRequest。對於簡單的過濾器,大多數過濾邏輯是基於這個對象的。如果處理HTTP請求,並且需要訪問諸如getHeader或getCookies等在ServletRequest中無法得到的方法,就要把此對象構造成HttpServletRequest。
第二個參數爲ServletResponse。除了在兩個情形下要使用它以外,通常忽略這個參數。首先,如果希望完全阻塞對相關servlet或JSP頁面的訪問。可調用response.getWriter並直接發送一個響應到客戶機.

其次,如果希望修改相關的servlet或JSP頁面的輸出,可把響應包含在一個收集所有發送到它的輸出的對象中。然後,在調用serlvet或JSP頁面後,過濾器可檢查輸出,如果合適就修改它,之後發送到客戶機

 

DoFilter的最後一個參數爲FilterChain對象。對此對象調用doFilter以激活與servlet或JSP頁面相關的下一個過濾器。如果沒有另一個相關的過濾器,則對doFilter的調用激活servlet或JSP本身。
l public void init(FilterConfig config)
thows ServletException
init方法只在此過濾器第一次初始化時執行,不是每次調用過濾器都執行它。對於簡單的過濾器,可提供此方法的一個空體,但有兩個原因需要使用init。首先,FilterConfig對象提供對servlet環境及web.xml文件中指派的過濾器名的訪問。因此,普遍的辦法是利用init將FilterConfig對象存放在一個字段中,以便doFilter方法能夠訪問servlet環境或過濾器名。

 

其次,FilterConfig對象具有一個getInitParameter方法,它能夠訪問部署描述符文件(web.xml)中分配的過濾器初始化參數.

 

l public void destroy( )
此方法在利用一個給定的過濾器對象永久地終止服務器(如關閉服務器)時調用。大多數過濾器簡單地爲此方法提供一個空體,不過,可利用它來完成諸如關閉過濾器使用的文件或數據庫連接池等清除任務。
1.2 將過濾行爲放入doFilter方法
doFilter方法爲大多數過濾器地關鍵部分。每當調用一個過濾器時,都要執行doFilter。對於大多數過濾器來說,doFilter執行的步驟是基於傳入的信息的。因此,可能要利用作爲doFilter的第一個參數提供的ServletRequest。這個對象常常構造爲HttpServletRequest類型,以提供對該類的更特殊方法的訪問。
1.3 調用FilterChain對象的doFilter方法
Filter接口的doFilter方法以一個FilterChain對象作爲它的第三個參數。在調用該對象的doFilter方法時,激活下一個相關的過濾器。這個過程一般持續到鏈中最後一個過濾器爲止。在最後一個過濾器調用其FilterChain對象的doFilter方法時,激活servlet或頁面自身。
但是,鏈中的任意過濾器都可以通過不調用其FilterChain的doFilter方法中斷這個過程。在這樣的情況下,不再調用JSP頁面的serlvet,並且中斷此調用過程的過濾器負責將輸出提供給客戶機。

 

1.4 對適當的servlet和JSP頁面註冊過濾器
部署描述符文件的2.3版本引入了兩個用於過濾器的元素,分別是:filter和filter-mapping。filter元素向系統註冊一個過濾對象,filter-mapping元素指定該過濾對象所應用的URL。
1.filter元素
filter元素位於部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個可能的子元素:
l icon 這是一個可選的元素,它聲明IDE能夠使用的一個圖象文件。
l filter-name 這是一個必需的元素,它給過濾器分配一個選定的名字。
l display-name 這是一個可選的元素,它給出IDE使用的短名稱。
l description 這也是一個可選的元素,它給出IDE的信息,提供文本文檔。
l filter-class 這是一個必需的元素,它指定過濾器實現類的完全限定名。
l init-param 這是一個可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數。單個過濾器元素可包含多個init-param元素。
請注意,過濾是在serlvet規範2.3版中初次引入的。因此,web.xml文件必須使用DTD的2.3版本

 

2.filter-mapping元素
filter-mapping元素位於web.xml文件中filter元素之後serlvet元素之前。它包含如下三個可能的子元素::
l filter-name 這個必需的元素必須與用filter元素聲明時給予過濾器的名稱相匹配。
l url-pattern 此元素聲明一個以斜槓(/)開始的模式,它指定過濾器應用的URL。所有filter-mapping元素中必須提供url-pattern或servlet-name。但不能對單個filter-mapping元素提供多個url-pattern元素項。如果希望過濾器適用於多個模式,可重複整個filter-mapping元素。
l servlet-name 此元素給出一個名稱,此名稱必須與利用servlet元素給予servlet或JSP頁面的名稱相匹配。不能給單個filter-mapping元素提供多個servlet-name元素項。如果希望過濾器適合於多個servlet名,可重複這個filter-mapping元素。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1)定義初始化參數。使用web.xml中的filter的init-param子元素以及param-nam和param-value子元素,如下所示。

<filter>
<filter-name>SomeFilter</filter-name>
<filter-class>somePackage.SomeFilterClass</filter-class>
<init-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>value2</param-value>
</init-param>
</filter>

2)讀初始化參數。從過濾器的inti方法中調用FilterConfig的getInitParameter方法。如下所示。

public void init(FilterConfig config)
throws ServletException {
String val1 = config.getInitParameter("param1");
String val2 = config.getInitParameter("param2");
...
}

3)分析初始化參數。就像servlet和JSP的初始化參數一樣,每個過濾器的初始化都是String類型的。因此,如果想要其他類型的值,必須對它進行轉換。例如,可用Integer.parseInt將String“7”轉換爲int 7。在分析時,別忘了檢查缺少的和不良的數據。缺少初始化參數將導致從getInitParameter返回null。即使這些參數存在,也一個來考慮到部署人員不正確地對其值進行格式化的可能性。例如,在轉換String類型的值爲int類型的值時,應該將Integer.parseInt調用封在try/catch中,這個塊捕捉NumberFormatException。這種辦法徹底地處理了null和格式化不正確的值。

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章