JavaWeb課程系列

第14章Filter

1.提出問題

1、我們?cè)谠L問后臺(tái)很多頁(yè)面時(shí)都需要登錄,只有登錄的用戶才能查看這些頁(yè)面,我們需要在每次請(qǐng)求的時(shí)候都檢查用戶是否登陸,這樣做很麻煩,有沒有一種方法可以在我們請(qǐng)求之前就幫我們做這些事情。有!

 

2、我們web應(yīng)用經(jīng)常會(huì)接收中文字符,由于可能導(dǎo)致中文亂碼,我們每次都需要在方法的開始使用request.setCharacterEncoding(“utf-8”);能不能在我們要獲取參數(shù)值直接就可以自己設(shè)置好編碼呀。能!

 

這種問題的解決方法我們想到了一種辦法。那就是在每次請(qǐng)求之前我們先將它攔截起來,當(dāng)我們?cè)O(shè)置好一切東西的時(shí)候,再將請(qǐng)求放行。類似與我們地鐵站的檢票系統(tǒng)。每個(gè)人進(jìn)站的時(shí)候必須刷卡,扣完錢后才可以進(jìn)站坐車。

 

web中也有這個(gè)機(jī)制,我們叫做過濾器。

就是我們接下來學(xué)習(xí)的filter

2.Filter簡(jiǎn)介

2.1什么是filter

???????? 1)Filter(過濾器) 的基本功能是對(duì) Servlet 容器調(diào)用 Servlet (JSP)的過程進(jìn)行攔截,??? 從而在 Servlet 處理請(qǐng)求前和Servlet響應(yīng)請(qǐng)求后實(shí)現(xiàn)一些特殊的功能。

???????? 2)在 Servlet API 中定義了三個(gè)接口類來開供開發(fā)人員編寫 Filter 程序:Filter, ????? FilterChain, FilterConfig

???????? 3)Filter 程序是一個(gè)實(shí)現(xiàn)了 Filter 接口的 Java 類,與 Servlet 程序相似,它由 Servlet ?????? 容器進(jìn)行調(diào)用和執(zhí)行

???????? 4)Filter 程序需要在 web.xml 文件中進(jìn)行注冊(cè)和設(shè)置它所能攔截的資源:Filter 程序??? 可以攔截 Jsp, Servlet, 靜態(tài)圖片文件和靜態(tài) html 文件

2.2 filter的運(yùn)行原理是什么

 

這個(gè)Servlet過濾器就是我們的filter

 

1)當(dāng)在 web.xml 中注冊(cè)了一個(gè) Filter 來對(duì)某個(gè) Servlet 程序進(jìn)行攔截處理時(shí),這個(gè) Filter 就成了 Tomcat與該 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)行修改

2)在一個(gè) web 應(yīng)用程序中可以注冊(cè)多個(gè) Filter 程序,每個(gè) Filter 程序都可以對(duì)一個(gè)或一組 Servlet 程序進(jìn)行攔截。

3)若有多個(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 中映射的順序一致