Filter

Filter可以擔任瀏覽器與JSP/Servlet之間的一個中介處理者,一些request的前置處理動作及一些response的後置處理,都可以交由這個中介處理者來完成,當然Filter可以達到的功能,您也可以直接撰寫在JSP/Servlet中,但如果有很多JSP/Servlet都需要相同的處理,例如某些網頁都需要統一的身份驗證方式時,與其在每一個網頁中都撰寫驗證的程式碼,不如直接撰寫Filter,讓它來統一進行處理

Filter實際上是一個純綷的Java類別程式,它要實作javax.servlet.Filter介面,這個介面中有三個必須實作的方法:init()、destory()與doFilter()。init()是Filter類別被載入時會執行的方法,而destory()是 Filter物件生命週期結束時會執行的方,至於doFilter()則是實作Filter功能的核心,您想要Filter完成的工作就撰寫在其中,先來撰寫一個簡單的Filter類,如下:
  • FilterDemo1.java


在這個程式中,只是簡單的顯示一些文字,表示Filter的doFilter()方法有被執行,doFilter()傳入三個參數, ServletRequest、ServletResponse、FilterChain,您可以獲得request與response物件,以對它們進行一些處理,像是設定標頭、編碼格式或包裝壓縮功能等等,至於FilterChain則是關於Filter執行順序的物件,這個順序是設定在 web.xml中,您必須呼叫它的doFilter()方法,纔可以執行下一個Filter,如果是最後一個Filter,則執行客戶端所請求的 JSP/Servlet網頁。

為了要能使用Filter,您必須在web.xml中撰寫一些設定,一個設定範例如下:

  • web.xml


<filter>與</filter>之間撰寫Filter的名稱與實際載入的類別,Filter類別檔是放置在WEB- INF/classes/下,而<filter-mapping>與</filter- mapping>之間則撰寫Filter名稱與所要過濾的資源對象,在這邊設定為/*,表示請求這個Web應用程式下的所有資源,都要先經過 Filter的處理。

如果設定的<url-pattern>套用了兩個Filter,則FilterChain在執行doFilter()方法時,其呼叫的 Filter順序就是您在web.xml中撰寫Filter的順序,例如再撰寫一個Filter程式:

  • FilterDemo2.java


web.xml中設定的內容是:
  • web.xml


則請求Web應用程式下的任一個資源,都會先執行FilterDemo1,然後再執行FilterDemo2,最後呼叫請求的資源,如果請求的資源是 JSP網頁,而它的功能只是印出 5 個Hello! World!:
  • test.jsp



則呼叫該JSP網頁時,所得到的結果是:

在實作Filter介面時必須實作init()方法,該方法傳入一個FilterConfig物件作為參數,它包括了一些容器傳遞給Filter,有關於Filter的相關設定資訊,您可以透過下面幾個方法來取得這些資訊:

public java.lang.String getFilterName()
public java.lang.String getInitParameter(java.lang.String name)
public java.util.Enumeration getInitParameterNames()
public ServletContext getServletContext()

其中getInitParameter()與getInitParameterNames()資訊的取得來源,即web.xml中設定的參數訊息,使用方法與之前設定Servlet時相同,一個例子如下:

  • web.xml


在Servlet 2.3之前,Filter的觸發只能透過使用者的直接請求,而在Servlet 2.4之後,您可以透過幾個可能的轉發或包括等方式來觸發Filter,這可以在web.xml中加以設定,觸發Filter的方式有FORWARD、 INCLUDE、REQUEST與ERROR,即轉發、包含、請求與錯誤網頁請求時,預設的觸發方式是REQUEST,您可以使用< dispatcher>標籤來加以設定,例如:

  • web.xml


除了在doFilter()中撰寫簡單的過濾功能、添加request或response的資訊之外,您也許還會想要直接的加強request與 response的處理方式,例如增加對請求資源的壓縮功能,這種在原來的request與response功能之上,再添加額外的處理功能,可以採用 Decorator 模式,在Servlet 2.4之後,提供了實作裝飾模式的Wrapper類別:ServletRequestWrapper、ServletResponseWrapper、 HttpServletRequestWrapper、HttpServletResponseWrapper,前兩者分別實作了 ServletRequest與ServletResponse,後兩者則分別又繼承了前兩者,您可以繼承這些類別,以裝飾模式來添加request與 response的額外處理能力。

Filter 1 is doing!!!
Filter 2 is doing!!!
Hello! World!
Hello! World!
Hello! World!
Hello! World!
Hello! World!
Filter 2's work is done
Filter 1's work is done 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章