好久沒寫部落格了。哈哈~寶刀未老呀,操起筆來準備11.11華華麗麗的來一篇。都說溫故知新,這句話絕對正确。按着人的記憶曲線,溫故是鞏固記憶力的好辦法。就像我還是經常翻翻自己寫的部落格。回頭來看看到的是新的東西。那就足夠了。

從右到左:人生境界也
什麼是過濾器呢?
其
實過濾器(filter)和servlet很相似,都是java的元件。即請求發送servlet之前,可以用其截獲和處理請求,也可以在serlvet
結束工作之後,在響應發回之前處理響應。是以,和上篇一樣,過濾器filter是攔截請求,并對傳給請求資源的servletrequest 或
servletresponse 進行處理的一個對象。如圖:簡單的描述其工作原理
過濾器做的事情
這是我們最希望做看到的事情,其實filter可以當成一個插件元件。它的作用于request和response之間。
請求過濾器的作用:
完成安全檢查
重新格式化請求首部或者體
建立請求審計和日志
響應過濾器的作用:
壓縮相應流
追加或者修改流
建立一個完全不同的響應
servlet
api中提供了一個filter接口,開發應用時,如果編寫的java類實作了這個接口,則把這個java類稱之為過濾器filter。filter的實
現類實作了一個j2ee的過濾器,過濾器的api允許通路servletcontext,同樣可以連結到另一個filter。
filter類似于servlet一個樣,有一個生命周期。裡面有:init(), destroy(),還有個核心方法:dofilter()。
init(filterconfig):這是filter的初始化方法,servlet容器建立filter執行個體後将調用這個方法。在這個方法中可以讀取web.xml檔案中filter的初始化參數
dofilter(servletrequest,servletresponse,filterchain):
這個方法完成實際的過濾操作,當客戶請求通路于filter關聯的url時,servlet容器将先調用filter的dofilter方法。
filterchain參數用于通路後續filters
destroy(): servlet容器在銷毀filter執行個體前調用該方法,這個方法中可以釋放filter占用的資源
過濾器執行機制圖:
此我們實作這個接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<code>public</code> <code>class</code> <code>demofilter</code><code>implements</code> <code>filter</code>
<code>{</code>
<code> </code><code>@override</code>
<code> </code><code>public</code> <code>void</code> <code>init(filterconfig filterconfig)</code><code>throws</code> <code>servletexception</code>
<code> </code><code>{</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>dofilter(servletrequest request, servletresponse response,</code>
<code> </code><code>filterchain chain)</code><code>throws</code> <code>ioexception, servletexception</code>
<code> </code><code>chain.dofilter(request, response);</code>
<code> </code><code>public</code> <code>void</code> <code>destroy()</code>
<code> </code><code>//完成清理工作</code>
<code>}</code>
dofilter(servletrequest request, servletresponse response, filterchain chain)
大家主要看看這個參數:servletrequest /servletresponse
。這個方法不取http請求和相應對象做參數,而隻是正常的servletrequest /servletresponse
對象。這裡是對通用性的設計,過濾器的設計的要通用,如果過濾器用于一個非web應用,是以實作非http接口。但不用擔心的
是,servletresponse 是httpservletresponse的超類。
從filter執行機制圖,我們可以體會到其設計很像一個東西---”棧“。可以從我書中摘錄的一張圖檔體會:filter3→filter7→serlveta→filter7→filter3
重讀filter的積累。