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