| 一、Servlet過濾器的概念: *************************************************************************************** Servlet過濾器是在Java Servlet規(guī)范2.3中定義的,它能夠?qū)ervlet容器的請(qǐng)求和響應(yīng)對(duì)象進(jìn)行檢查和修改?! ?br> Servlet過濾器本身并不產(chǎn)生請(qǐng)求和響應(yīng)對(duì)象,它只能提供過濾作用。Servlet過期能夠在Servlet被調(diào)用之前檢查Request對(duì)象,修改Request Header和Request內(nèi)容;在Servlet被調(diào)用之后檢查Response對(duì)象,修改Response Header和Response內(nèi)容。 Servlet過期負(fù)責(zé)過濾的Web組件可以是Servlet、JSP或者HTML文件。 *************************************************************************************** 二、Servlet過濾器的特點(diǎn): *************************************************************************************** A.Servlet過濾器可以檢查和修改ServletRequest和ServletResponse對(duì)象 B.Servlet過濾器可以被指定和特定的URL關(guān)聯(lián),只有當(dāng)客戶請(qǐng)求訪問該URL時(shí),才會(huì)觸發(fā)過濾器 C.Servlet過濾器可以被串聯(lián)在一起,形成管道效應(yīng),協(xié)同修改請(qǐng)求和響應(yīng)對(duì)象 *************************************************************************************** 三、Servlet過濾器的作用: *************************************************************************************** A.查詢請(qǐng)求并作出相應(yīng)的行動(dòng)。 B.阻塞請(qǐng)求-響應(yīng)對(duì),使其不能進(jìn)一步傳遞。 C.修改請(qǐng)求的頭部和數(shù)據(jù)。用戶可以提供自定義的請(qǐng)求。 D.修改響應(yīng)的頭部和數(shù)據(jù)。用戶可以通過提供定制的響應(yīng)版本實(shí)現(xiàn)。 E.與外部資源進(jìn)行交互。 *************************************************************************************** 四、Servlet過濾器的適用場(chǎng)合: *************************************************************************************** A.認(rèn)證過濾 B.登錄和審核過濾 C.圖像轉(zhuǎn)換過濾 D.?dāng)?shù)據(jù)壓縮過濾 E.加密過濾 F.令牌過濾 G.資源訪問觸發(fā)事件過濾 H.XSL/T過濾 I.Mime-type過濾 *************************************************************************************** 五、Servlet過濾器接口的構(gòu)成: *************************************************************************************** 所有的Servlet過濾器類都必須實(shí)現(xiàn)javax.servlet.Filter接口。這個(gè)接口含有3個(gè)過濾器類必須實(shí)現(xiàn)的方法: A.init(FilterConfig): 這是Servlet過濾器的初始化方法,Servlet容器創(chuàng)建Servlet過濾器實(shí)例后將調(diào)用這個(gè)方法。在這個(gè)方法中可以讀取web.xml文件中Servlet過濾器的初始化參數(shù) B.doFilter(ServletRequest,ServletResponse,FilterChain): 這個(gè)方法完成實(shí)際的過濾操作,當(dāng)客戶請(qǐng)求訪問于過濾器關(guān)聯(lián)的URL時(shí),Servlet容器將先調(diào)用過濾器的doFilter方法。FilterChain參數(shù)用于訪問后續(xù)過濾器 B.destroy(): Servlet容器在銷毀過濾器實(shí)例前調(diào)用該方法,這個(gè)方法中可以釋放Servlet過濾器占用的資源 *************************************************************************************** 六、Servlet過濾器的創(chuàng)建步驟: *************************************************************************************** A.實(shí)現(xiàn)javax.servlet.Filter接口 B.實(shí)現(xiàn)init方法,讀取過濾器的初始化函數(shù) C.實(shí)現(xiàn)doFilter方法,完成對(duì)請(qǐng)求或過濾的響應(yīng) D.調(diào)用FilterChain接口對(duì)象的doFilter方法,向后續(xù)的過濾器傳遞請(qǐng)求或響應(yīng) E.銷毀過濾器 *************************************************************************************** 七、Servlet過濾器對(duì)請(qǐng)求的過濾: *************************************************************************************** A.Servlet容器創(chuàng)建一個(gè)過濾器實(shí)例 B.過濾器實(shí)例調(diào)用init方法,讀取過濾器的初始化參數(shù) C.過濾器實(shí)例調(diào)用doFilter方法,根據(jù)初始化參數(shù)的值判斷該請(qǐng)求是否合法 D.如果該請(qǐng)求不合法則阻塞該請(qǐng)求 E.如果該請(qǐng)求合法則調(diào)用chain.doFilter方法將該請(qǐng)求向后續(xù)傳遞 *************************************************************************************** 八、Servlet過濾器對(duì)響應(yīng)的過濾: *************************************************************************************** A.過濾器截獲客戶端的請(qǐng)求 B.重新封裝ServletResponse,在封裝后的ServletResponse中提供用戶自定義的輸出流 C.將請(qǐng)求向后續(xù)傳遞 D.Web組件產(chǎn)生響應(yīng) E.從封裝后的ServletResponse中獲取用戶自定義的輸出流 F.將響應(yīng)內(nèi)容通過用戶自定義的輸出流寫入到緩沖流中 G.在緩沖流中修改響應(yīng)的內(nèi)容后清空緩沖流,輸出響應(yīng)內(nèi)容 *************************************************************************************** 九、Servlet過濾器的發(fā)布: *************************************************************************************** A.發(fā)布Servlet過濾器時(shí),必須在web.xml文件中加入<filter>元素和<filter-mapping>元素。 B.<filter>元素用來定義一個(gè)過濾器: 屬性 含義 filter-name 指定過濾器的名字 filter-class 指定過濾器的類名 init-param 為過濾器實(shí)例提供初始化參數(shù),可以有多個(gè) C.<filter-mapping>元素用于將過濾器和URL關(guān)聯(lián): 屬性 含義 filter-name 指定過濾器的名字 url-pattern 指定和過濾器關(guān)聯(lián)的URL,為”/*”表示所有URL *************************************************************************************** 十一、Servlet過濾器使用的注意事項(xiàng) *************************************************************************************** A.由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下,并非HTTP包所特有的,所以其中所用到的請(qǐng)求、響應(yīng)對(duì)象ServletRequest、ServletResponse在使用前都必須先轉(zhuǎn)換成HttpServletRequest、HttpServletResponse再進(jìn)行下一步操作。 B.在web.xml中配置Servlet和Servlet過濾器,應(yīng)該先聲明過濾器元素,再聲明Servlet元素 C.如果要在Servlet中觀察過濾器生成的日志,應(yīng)該確保在server.xml的localhost對(duì)應(yīng)的<host>元素中配置如下<logger>元素: <Logger className = “org.apache.catalina.logger.FileLogger” directory = “logs”prefix = “localhost_log.”suffix=”.txt” timestamp = “true”/> *************************************************************************************** | 
|  |