過濾器基本概念: 過濾器能夠對目標資源的請求和響應進行截取,在過濾器中對用戶請求進行統一處理。 過濾器是一個程序,它先于與之相關的servlet或JSP頁面運行在服務器上。過濾器可附加到一個或多個servlet或JSP頁面上,并且可以檢查 進入這些資源的請求信息。過濾器是雙向的,容器接受到一個對資源的請求時,它將判斷是否有過濾器與這個資源相關聯。如果有,那么容器將 把請求交給過濾器進行處理。在過濾器中,你可以改變請求的內容,或者重新設置請求的報頭信息,然后再將請求發送給目標資源。當目標資源 對請求作出響應時候,容器同樣會將響應先轉發給過濾器,再過濾器中,你可以對響應的內容進行轉換,然后再將響應發送到客戶端 過濾器的構造的全面解析: 任何一個過濾器,都要實現Filter接口,重寫init,doFilter,destory方法。 ①
init會在容器初始化時被調用 init方法只會在該Filter第一次被調用時初始化。對于簡單的過濾器,可提供此方法的一個空體,但有兩個原因需要使用init。首先,FilterConfig對象提 供對servlet環境及web.xml文件中指派的過濾器名的訪問。因此,普遍的辦法是利用init將FilterConfig對象存放在一個字段中,以便doFilter方法能夠訪 問servlet環境或過濾器名。其次,FilterConfig對象具有一個getInitParameter方法,它能夠訪問部署描述符文件(web.xml)中分配的過濾器初始化參 數。
FilterConfig接口:
javax.servlet.FilterConfig接口類似于javax.servlet.ServletConfig接口,用于在過濾器初始化時,向其傳遞信息。ilterConfig
接口有容器實現,容器將其作為參數傳入過濾器對象的init()方法中。在FilterConfig接口,定義了4個方法:
·public java.lang.String getFilterName()
得到描述符中指定的過濾器的名字。
·public java.lang.String getInitParameter(java.lang.String name)
返回在部署描述中指定的名字為name的初始化參數的值。如果不存在返回null.
·public java.util.Enumeration getInitParameterNames()
返回過濾器的所有初始化參數的名字的枚舉集合。
·public ServletContext getServletContext()
返回Servlet上下文對象的引用。 ②
1.ServletRequest對象,此對象給過濾器提供了對進入的信息(包括表單數據、cookie和HTTP請求頭)的完全訪問,多數情況下,需要將 ServletRequest對象構造成HttpServletRequest對象。 2.ServletResponse對象,簡單過濾器則忽略該對象。 3.FilterChain對象,在調用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被 激活。 對于doFilter方法,是每次請求與此過濾器相關的servlet或JSP頁面都會調用的方法。除了在兩個情形下要使用它以外,通常忽略這個參數。首先,如 果希望完全阻塞對相關servlet或JSP頁面的訪問。可調用response.getWriter并直接發送一個響應到客戶機。其次,如果希望修改相關的servlet或JSP頁 面的輸出,可把響應包含在一個收集所有發送到它的輸出的對象中。然后,在調用serlvet或JSP頁面后,過濾器可檢查輸出,如果合適就修改它, 之后發送到客戶機。 ③
此方法在利用一個給定的過濾器對象永久地終止服務器(如關閉服務器)時調用。大多數過濾器簡單地為此方法提供一個空體,不過,可利用它 來完成諸如關閉過濾器使用的文件或數據庫連接池等清除任務。 說說FilterChain對象的doFilter方法,Filter接口的doFilter方法以一個FilterChain對象作為它的第三個參數。在調用該對象的doFilter方法時,激活下一個 相關的過濾器。這個過程一般持續到鏈中最后一個過濾器為止。在最后一個過濾器調用其FilterChain對象的doFilter方法時,激活servlet或頁面自身。 但是,鏈中的任意過濾器都可以通過不調用其FilterChain的doFilter方法中斷這個過程。在這樣的情況下,不再調用JSP頁面的serlvet,并且中斷此調 用過程的過濾器負責將輸出提供給客戶機。 web.xml中對Filter的標準配置
注:默認情況下,過濾器是按照配置文件中添加的順序應用于收到的數據。 激活器servlet
要傳遞參數的時候最好使用form進行傳參,如果使用鏈接的話當中文字符的時候過濾器轉碼是不會起作用的,還有就是頁面上form的method也要設 置為post,不然過濾器也起不了作用。 過濾器的工作方式: 一:request過濾器 請求直接從客戶端發過來 通過在<dispatcher>元素中指定值REQUEST,或者不寫任何<dispatcher>元素的方式指定 二:forward過濾器 web組件使用forward()調用匹配<url-pattern>或<servlet-name>。 這通過在<dispatcher>元素中設定值FORWARD指定 三:include過濾器 web組件使用include()調用匹配<url-pattern>或<servlet-name>。 這通過在<dispatcher>元素中設置值INCLUDE指定 四:error過濾器 請求使用在“錯誤處理”中描述的錯誤機制進行處理,讓錯誤資源匹配<url-pattern>。這通過在<dispatcher>元素中設置值ERROR指定
對于上面配置,當出現空指針,或空指針時,就會跳轉到error.jsp頁面,在訪問error.jsp頁面前,由于對error.jsp進行了過濾,先執行ErrorPageFilter,然后轉向error.jsp 如果我們實際訪問時,如果這個頁面中有response.sendError(500,"出錯了!"),或者手動拋出空指針時,;那么該錯誤頁面仍然會被調用,過濾器也會工作。 過濾器的實踐: 一:統一過濾HTTP請求(響應)頭(如:使瀏覽器不緩存頁面的過濾器 ) 二、權限控制(對不同角色在系統中跳轉進行檢查控制) 三、字符編碼的過濾器 (對post數據起效) 四、資源保護過濾器 (檢測用戶是否登陸的過濾器 ) 五、阻塞請求 參考文獻:http://www.vipcn.com/wangluobiancheng/JSP/servletheJSPguoluqiFilter.html
Powered by: BlogJava Copyright © Gavin.lee