1.以正常方式調用資源(即調用servlet或JSP頁面)。
2.用修改後的請求信息調用資源。
3.調用資源,但在向客戶端發送響應之前對其進行修改
4.停止資源調用,轉到其他資源,返回特定的狀態代碼或生成替代輸出。
1.建立壹個基本過濾器
創建過濾器包括以下五個步驟:
1)建立壹個實現過濾器接口的類。這個類需要三個方法: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)中的過濾器和過濾器映射元素。
5)禁用激活器servlet。通過使用默認servlet URL防止用戶繞過過濾器設置。
1.1建立壹個實現過濾器接口的類。
所有過濾器都必須實現javax.servlet.Filter該接口包含三個方法,即doFilter、init和destroy。
public void do filter(ServletRequset請求,
ServletResponse響應,
過濾器鏈鏈)
thows ServletException,IOException
每當調用過濾器時(即每次請求與該過濾器相關的servlet或JSP頁面時),都會執行其doFilter方法。正是這種方法包含了大部分過濾邏輯。第壹個參數是與傳入請求相關的ServletRequest。對於簡單的過濾器,大多數過濾邏輯都基於該對象。如果您處理壹個HTTP請求並需要訪問ServletRequest中不可用的方法,如getHeader或getCookies,您應該將此對象構造為HttpServletRequest。
第二個參數是ServletResponse。除了兩種情況外,該參數通常被忽略。首先,如果您想完全阻止對相關servlet或JSP頁面的訪問。您可以調用response.getWriter並直接向客戶端發送響應。其次,如果您想修改相關servlet或JSP頁面的輸出,可以將響應包含在壹個對象中,該對象收集發送給它的所有輸出。然後,在調用serlvet或JSP頁面後,過濾器可以檢查輸出,如果合適的話進行修改,然後將其發送到客戶端。
DoFilter的最後壹個參數是FilterChain對象。對該對象調用doFilter來激活與servlet或JSP頁面相關的下壹個過濾器。如果沒有其他相關的過濾器,對doFilter的調用將激活servlet或JSP本身。
公共void init(filter config配置)thows ServletException
init方法僅在首次初始化過濾器時執行,而不是在每次調用過濾器時執行。對於簡單的過濾器,您可以提供該方法的空主體,但是出於兩個原因您需要使用init。首先,FilterConfig對象提供對servlet環境和在web.xml文件中分配的過濾器名稱的訪問。因此,常用的方法是通過使用init將FilterConfig對象存儲在壹個字段中,以便doFilter方法可以訪問servlet環境或過濾器名稱。其次,FilterConfig對象有壹個getInitParameter方法,該方法可以訪問部署描述符文件(web.xml)中分配的過濾器初始化參數。
公共void銷毀()
大多數過濾器只是為該方法提供壹個空體,然而,它可用於完成清理任務,如關閉過濾器或數據庫連接池使用的文件。
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對象,filter-mapping元素指定應用filter對象的URL。
以下是壹個完整的示例:
//創建實現篩選器接口的類。這個類需要三個方法:doFilter、init和destroy。
//doFilter方法//包含主過濾代碼,init方法建立設置操作,destroy方法清除它。
包過濾器pkg;
導入javax . servlet . *;
導入javax . servlet/XML/ns/J2EE“
xmlns:xsi =“/XML/ns/J2EE
/XML/ns/J2EE/we B- app _ 2 _ 4 . xsd“& gt;
& lt過濾器& gt
& lt過濾器名稱& gt校驗碼</filter-name & gt;
& lt過濾器類& gtfilter pkg . test filter & lt;/filter-class & gt;
& lt/filter & gt;
& lt過濾器映射& gt
& lt過濾器名稱& gt校驗碼</filter-name & gt;
& lturl模式& gt/* & lt;/URL-pattern & gt;
& lt/filter-mapping & gt;
& ltservlet & gt
& lt描述& gt這是我的J2EE組件的描述& lt/description & gt;
& lt顯示名稱& gt這是我的J2EE組件的顯示名稱</display-name & gt;
& ltservlet-name & gt;ControlServlet & lt/servlet-name & gt;
& ltservlet-class & gt;filterpkg。ControlServlet & lt/servlet-class & gt;
& lt/servlet & gt;
& ltservlet映射& gt
& ltservlet-name & gt;ControlServlet & lt/servlet-name & gt;
& lturl模式& gt*.do & lt/URL-pattern & gt;
& lt/servlet-mapping & gt;
& lt/we B- app & gt;