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