一. web過濾器的介紹
1.過濾器
在生活中,過濾這種我們時常可見;比如水資源的處理,化學藥劑的提取等等。所謂過濾,就是指對某事物的處理進行一定的處理獲取相應的結果的一個過程。它可以總結為下:
過濾源==>過濾規則==>過濾結果
過濾源:需要過濾的東西
過濾規則:對過濾東西的處理
過濾結果:經過過濾后所得的東西
2.web過濾器
過濾器在web中的應用定義
過濾器 是一個服務器端的組件,它可以截取用戶端的請求和響應信息,并對這些信息過濾。
3.web過濾器的工作原理
在沒有過濾器的情況下,用戶的請求可以直接進行訪問服務器web資源
在存在過濾器的情況下,客戶端的請求是不能直接訪問服務器端web資源。
過濾器的具體工作原理:
過濾器在web程序啟動的時候便會進行加載。用戶發送請求并不是直接到web資源,而是先到過濾器;過濾器判斷我們的請求是否合法、是否符合規則;符合規則后過濾器再將用戶請求發送到web資源;web資源處理完信息響應到過濾器;過濾器再將web資源的響應發送給用戶
3.web過濾器的生命周期
web的生命周期分為四種
- 實例化:在web程序啟動的時候,通過web.xml文件中的配置去加載過濾器。只會實例化一次。
- 初始化:啟動后,會進入到初始化。會調用
init()
方法加載初始化信息。只執行一次。 - 過濾:過濾器每次捕獲到請求都會執行過濾方法
doFilter()
。可執行多次。 - 銷毀:web容器關閉的時候執行
destory()
方法銷毀過濾器對象。
4.web過濾器中的方法
-
init()
:過濾器的初始化方法,web容器創建過濾器實例后將調用這個方法,這個方法可以讀取web.xml文件中過濾器的參數。 -
doFilter()
:這個方法完成實際的過濾操作,想過濾器的核心方法。當用戶訪問請求與過濾器關聯的URL時,web容器將先調用過濾器的doFilter()
方法。FilterChain
參數可以調用chain.doFilter()
方法,將請求傳給下一個過濾器(或目標資源),或利用轉發、重定向將請求轉發到其他資源。 -
destroy()
:web容器在銷毀過濾器實例前調用該方法,在這個方法中可以釋放過濾器占用的資源。(大多數情況用不到)
二.過濾器簡單案例
1.創建web項目。并創建一個類實現Filter接口
2.在web.xml中配置過濾器
<!-- ……………… -->
<!-- Filter配置 -->
<filter>
<filter-name>Filter名字</filter-name>
<filter-class>Filter的完整類名稱</filter-class>
<description>描述信息</description>
<init-param>
<param-name>參數名稱</param-name>
<param-name>參數的值</param-name>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter名字</filter-name>
<url-pattern>URL</url-pattern>
<dispatcher></dispatcher>
</filter-mapping>
<!-- ……………… -->
注意:
-
filter-class
:必須是類的全路徑(即包括報名) -
init-param
:初始化參數,可以是零對或者多對 -
url-pattern
:當用戶請求的URL和指定的URL路徑相匹配時,將觸發過濾器工作 -
dispatcher
:指定過濾器所攔截資源被Servlet容器調用的方式。可以使REQUEST
,INCLUDE
,FORWARD
和ERROR
之一,默認是REQUEST
3.在類中寫輸出數據測試
在Filter的實現類中的方法中寫入輸出數據,在
index.jsp
中前面增加輸出。方便之后看到過濾器執行耳朵順序。
4.啟動服務器,訪問index.jsp頁面
訪問https://http://127.0.0.1:8080/Filter/
后仔細觀察運行結果
所以可以總結Filter實現類中方法的運行順序為:
構造器==> init() ==> doFilter() ==>…………==> destroy()
在執行doFilter()
方法時,chain.doFilter()
方法將請求傳給了index.jsp
,最后才輸出end……doFilter
面試題兩點:
1.過濾器可以更改用戶請求的路徑
2.過濾器不能直接處理用戶請求的數據,也不能直接返回數據
三.過濾器鏈
1.過濾器鏈
過濾器鏈:指針對一個用戶請求,而根據路徑所匹配到的過濾器有多個。這時候用戶請求就會依次通過各個過濾器到達web資源。
2.過濾器鏈的執行順序以及原理
服務器會按照
web.xml
文件中過濾器定義的先后順序組裝成一條過濾器鏈。通過doFilter()
方法依次執行后面的過濾器直至所有過濾器執行完畢后訪問到web資源。