From Gossip@caterpillar

JSP/Servlet: Filter(2)



在實作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
...
<filter>
<filter-name>SomeFilter</filter-name>
<filter-class>onlyfun.caterpillar.SomeFilter</filter-class>
<init-param>
<param-name>parameter1</param-name>
<param-value>paramValue</param-value>
</init-param>
</filter>
...

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

除了在doFilter()中撰寫簡單的過濾功能、添加request或response的資訊之外,您也許還會想要直接的加強request與 response的處理方式,例如增加對請求資源的壓縮功能,這種在原來的request與response功能之上,再添加額外的處理功能,可以採用 Decorator 模式

在Servlet 2.4之後,提供了實作裝飾模式的Wrapper類別:ServletRequestWrapper、ServletResponseWrapper、 HttpServletRequestWrapper、HttpServletResponseWrapper,前兩者分別實作了 ServletRequest與ServletResponse,後兩者則分別又繼承了前兩者,您可以繼承這些類別,以裝飾模式來添加request與 response的額外處理能力。