資源描述:
《filter(過濾器)簡(jiǎn)介和工作原理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Filter(過濾器)簡(jiǎn)介和工作原理(2009-06-2420:25:33)標(biāo)簽:it?分類:javaFilter(過濾器)簡(jiǎn)介Filter的基本功能是對(duì)Servlet容器調(diào)用Servlet的過程進(jìn)行攔截,從而在Servlet進(jìn)行響應(yīng)處理的前后實(shí)現(xiàn)一些特殊的功能。在ServletAPI中定義了三個(gè)接口類來開供開發(fā)人員編寫Filter程序:Filter,FilterChain,FilterConfigFilter程序是一個(gè)實(shí)現(xiàn)了Filter接口的Java類,與Servlet程序相似,它由Servlet容器進(jìn)行調(diào)用和執(zhí)行Filter程序需要在web.xml文件中進(jìn)行注冊(cè)和設(shè)
2、置它所能攔截的資源:Filter程序可以攔截Jsp,Servlet,靜態(tài)圖片文件和靜態(tài)html文件?Filter的基本工作原理當(dāng)在web.xml中注冊(cè)了一個(gè)Filter來對(duì)某個(gè)Servlet程序進(jìn)行攔截處理時(shí),這個(gè)Filter就成了Servlet容器與該Servlet程序的通信線路上的一道關(guān)卡,該Filter可以對(duì)Servlet容器發(fā)送給Servlet程序的請(qǐng)求和Servlet程序回送給Servlet容器的相應(yīng)進(jìn)行攔截,可以決定是否將請(qǐng)求繼續(xù)傳遞給Servlet程序,以及對(duì)請(qǐng)求和相應(yīng)信息是否進(jìn)行修改在一個(gè)web應(yīng)用程序中可以注冊(cè)多個(gè)Filter程序,每個(gè)Filter程序
3、都可以對(duì)一個(gè)或一組Servlet程序進(jìn)行攔截。若有多個(gè)Filter程序?qū)δ硞€(gè)Servlet程序的訪問過程進(jìn)行攔截,當(dāng)針對(duì)該Servlet的訪問請(qǐng)求到達(dá)時(shí),web容器將把這多個(gè)Filter程序組合成一個(gè)Filter鏈(過濾器鏈)。Filter鏈中各個(gè)Filter的攔截順序與它們?cè)趹?yīng)用程序的web.xml中映射的順序一致?Filter接口init(FilterConfigfilterConfig)throwsServletException:在web應(yīng)用程序啟動(dòng)時(shí),web服務(wù)器將根據(jù)web.xml文件中的配置信息來創(chuàng)建每個(gè)注冊(cè)的Filter實(shí)例對(duì)象,并將其保存在服務(wù)器的內(nèi)存
4、中。Web容器創(chuàng)建Filter對(duì)象實(shí)例后,將立即調(diào)用該Filter對(duì)象的init方法。Init方法在Filter生命周期中僅執(zhí)行一次,web容器在調(diào)用init方法時(shí),會(huì)傳遞一個(gè)包含F(xiàn)ilter的配置和運(yùn)行環(huán)境的FilterConfig對(duì)象(FilterConfig的用法和ServletConfig類似)。利用FilterConfig對(duì)象可以得到ServletContext對(duì)象,以及部署描述符中配置的過濾器的初始化參數(shù)。在這個(gè)方法中,可以拋出ServletException異常,通知容器該過濾器不能正常工作。?destroy():在Web容器卸載Filter對(duì)象之前被調(diào)用
5、。該方法在Filter的生命周期中僅執(zhí)行一次。在這個(gè)方法中,可以釋放過濾器使用的資源。?與開發(fā)Servlet不同的是,F(xiàn)ilter接口并沒有相應(yīng)的實(shí)現(xiàn)類可供繼承,要開發(fā)過濾器,只能直接實(shí)現(xiàn)Filter接口。?doFilter(ServletRequestrequest,ServletResponseresponse,????FilterChainchain)throwsjava.io.IOException,ServletException:????doFilter()方法類似于Servlet接口的service()方法。當(dāng)客戶端請(qǐng)求目標(biāo)資源的時(shí)候,容器就會(huì)調(diào)用與這個(gè)目
6、標(biāo)資源相關(guān)聯(lián)的過濾器的doFilter()方法。其中參數(shù)request,response為web容器或Filter鏈的上一個(gè)Filter傳遞過來的請(qǐng)求和相應(yīng)對(duì)象;參數(shù)chain為代表當(dāng)前Filter鏈的對(duì)象,在特定的操作完成后,可以在當(dāng)前Filter對(duì)象的doFilter方法內(nèi)部需要調(diào)用FilterChain對(duì)象的chain.doFilter(request,response)方法才能把請(qǐng)求交付給Filter鏈中的下一個(gè)Filter或者目標(biāo)Servlet程序去處理,也可以直接向客戶端返回響應(yīng)信息,或者利用RequestDispatcher的forward()和inclu
7、de()方法,以及HttpServletResponse的sendRedirect()方法將請(qǐng)求轉(zhuǎn)向到其他資源。這個(gè)方法的請(qǐng)求和響應(yīng)參數(shù)的類型是ServletRequest和ServletResponse,也就是說,過濾器的使用并不依賴于具體的協(xié)議。?FilterChain接口:FilterChain接口:代表當(dāng)前Filter鏈的對(duì)象。由容器實(shí)現(xiàn),容器將其實(shí)例作為參數(shù)傳入過濾器對(duì)象的doFilter()方法中。過濾器對(duì)象使用FilterChain對(duì)象調(diào)用過濾器鏈中的下一個(gè)過濾器,如果該過濾器是鏈中最后一個(gè)過濾器,那么將調(diào)用目標(biāo)資源。doF