新聞中心
創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
Filter簡(jiǎn)介
Filter也稱之為過濾器,它是Servlet技術(shù)中最實(shí)用的技術(shù),Web開發(fā)人員通過Filter技術(shù),對(duì)web服務(wù)器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html 文件等進(jìn)行攔截,從而實(shí)現(xiàn)一些特殊的功能。例如實(shí)現(xiàn)URL級(jí)別的權(quán)限訪問控制、過濾敏感詞匯、壓縮響應(yīng)信息等一些高級(jí)功能。
它主要用于對(duì)用戶請(qǐng)求進(jìn)行預(yù)處理,也可以對(duì)HttpServletResponse進(jìn)行后處理。使用Filter的完整流程:Filter對(duì)用戶請(qǐng)求進(jìn)行預(yù)處理,接著將請(qǐng)求交給Servlet進(jìn)行處理并生成響應(yīng),最后Filter再對(duì)服務(wù)器響應(yīng)進(jìn)行后處理。
Filter功能
在HttpServletRequest到達(dá) Servlet 之前,攔截客戶的HttpServletRequest 。根據(jù)需要檢查HttpServletRequest,也可以修改HttpServletRequest 頭和數(shù)據(jù)。
在HttpServletResponse到達(dá)客戶端之前,攔截HttpServletResponse 。根據(jù)需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數(shù)據(jù)。
如何借助Filter實(shí)現(xiàn)攔截功能
Filter接口中有一個(gè)doFilter方法,當(dāng)開發(fā)人員編寫好Filter,并配置對(duì)哪個(gè)web資源進(jìn)行攔截后,Web服務(wù)器每次在調(diào)用web資源的service方法之前,都會(huì)先調(diào)用一下filter的doFilter方法,因此,在該方法內(nèi)編寫代碼可達(dá)到如下目的:
調(diào)用目標(biāo)資源之前,讓一段代碼執(zhí)行。
是否調(diào)用目標(biāo)資源(即是否讓用戶訪問web資源)。
web服務(wù)器在調(diào)用doFilter方法時(shí),會(huì)傳遞一個(gè)filterChain對(duì)象進(jìn)來,filterChain對(duì)象是filter接口中最重要的一個(gè)對(duì)象,它也提供了一個(gè)doFilter方法,開發(fā)人員可以根據(jù)需求決定是否調(diào)用此方法,調(diào)用該方法,則web服務(wù)器就會(huì)調(diào)用web資源的service方法,即web資源就會(huì)被訪問,否則web資源不會(huì)被訪問。
Filter開發(fā)兩步走
編寫java類實(shí)現(xiàn)Filter接口,并實(shí)現(xiàn)其doFilter方法。
在web.xml文件中對(duì)編寫的filter類進(jìn)行注冊(cè),并設(shè)置它所能攔截的資源。
web.xml配置各節(jié)點(diǎn)介紹:
指定一個(gè)過濾器。 用于為過濾器指定一個(gè)名字,該元素的內(nèi)容不能為空。 元素用于指定過濾器的完整的限定類名。 元素用于為過濾器指定初始化參數(shù),它的子元素 指定參數(shù)的名字, 指定參數(shù)的值。 - 在過濾器中,可以使用FilterConfig接口對(duì)象來訪問初始化參數(shù)。
元素用于設(shè)置一個(gè) Filter 所負(fù)責(zé)攔截的資源。一個(gè)Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請(qǐng)求路徑 子元素用于設(shè)置filter的注冊(cè)名稱。該值必須是在 元素中聲明過的過濾器的名字 設(shè)置 filter 所攔截的請(qǐng)求路徑(過濾器關(guān)聯(lián)的URL樣式) 指定過濾器所攔截的Servlet名稱。 指定過濾器所攔截的資源被 Servlet 容器調(diào)用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認(rèn)REQUEST。用戶可以設(shè)置多個(gè) 子元素用來指定 Filter 對(duì)資源的多種調(diào)用方式進(jìn)行攔截。 子元素可以設(shè)置的值及其意義 - REQUEST:當(dāng)用戶直接訪問頁面時(shí),Web容器將會(huì)調(diào)用過濾器。如果目標(biāo)資源是通過RequestDispatcher的include()或forward()方法訪問時(shí),那么該過濾器就不會(huì)被調(diào)用。
- INCLUDE:如果目標(biāo)資源是通過RequestDispatcher的include()方法訪問時(shí),那么該過濾器將被調(diào)用。除此之外,該過濾器不會(huì)被調(diào)用。
- FORWARD:如果目標(biāo)資源是通過RequestDispatcher的forward()方法訪問時(shí),那么該過濾器將被調(diào)用,除此之外,該過濾器不會(huì)被調(diào)用。
- ERROR:如果目標(biāo)資源是通過聲明式異常處理機(jī)制調(diào)用時(shí),那么該過濾器將被調(diào)用。除此之外,過濾器不會(huì)被調(diào)用。
Filter鏈
在一個(gè)web應(yīng)用中,可以開發(fā)編寫多個(gè)Filter,這些Filter組合起來稱之為一個(gè)Filter鏈。
web服務(wù)器根據(jù)Filter在web.xml文件中的注冊(cè)順序,決定先調(diào)用哪個(gè)Filter,當(dāng)?shù)谝粋€(gè)Filter的doFilter方法被調(diào)用時(shí),web服務(wù)器會(huì)創(chuàng)建一個(gè)代表Filter鏈的FilterChain對(duì)象傳遞給該方法。在doFilter方法中,開發(fā)人員如果調(diào)用了FilterChain對(duì)象的doFilter方法,則web服務(wù)器會(huì)檢查FilterChain對(duì)象中是否還有filter,如果有,則調(diào)用第2個(gè)filter,如果沒有,則調(diào)用目標(biāo)資源。
Filter的生命周期
public void init(FilterConfig filterConfig) throws ServletException;//初始化
網(wǎng)站名稱:淺談Java中的Filter過濾器-創(chuàng)新互聯(lián)
文章來源:http://www.ef60e0e.cn/article/cegpcg.html