近日,學習異常緊張,馮老師為了讓我們提前感受專案的緊張氣氛,同時為了提高我們的專案感覺,**質量和速度,每天給我們布置了不少的任務,並在我們的要求下不斷從專案中抽出部分模組讓我們利用業餘時間來完成,所以最近睡眠質量明顯下降,有時為了搞清一段程式的原理,不斷地去翻閱底層源**,分析底層的過程是痛苦的,但是每當通過底層**弄清原理的時候總是有一種說不出的幸福感,但是有時候也會將自己繞進去出不來,導致凌晨兩三點大腦一直處於極度興奮,最後的結果發現聽課質量有些下降,為了更好的吸收老是上課的精華,給自己想了乙個方式,那就是記筆記,我發現這是乙個不錯的學習方法,不僅在聽課質量方面有了明顯的提高,也為自己課下複習提供了乙個非常好的大綱,基本不會落下任何乙個知識點,同時可以隨手記下自己沒能理解的地方,需要查閱資料的地方,這樣一天下來,感覺收穫頗豐啊!今天就和大家分享一下我的
serlet
過濾器的學習筆記吧。
一、
什麼是
web應用開發中過濾器以及他的功能
定義:過濾器其實是乙個程式,它先於與之相關的
servlet
或jsp
頁面執行在伺服器上。過濾器可附加到乙個或多個
servlet
或jsp
頁面上,並且可以檢查進入這些資源的請求資訊
功能:是對
servlet
容器呼叫
servlet
的過程進行攔截,從而在
servlet
進行響應處理的前後實現一些特殊的功能
二、
工作原理
當客戶端傳送請求,首先經過過濾器(過濾不合法動作以及不合法文字並進行處理),在
servlet
作為過濾器使用時,它可以對客戶的請求進行處理。處理完成後,它會交給下乙個過濾器處理,這樣,客戶的請求在過濾鏈裡逐個處理,直到請求傳送到目標為止。處理後可採取如下如下動作
①以常規的方式呼叫資源(即,呼叫
servlet
或jsp
頁面)。
②利用修改過的請求資訊呼叫資源。
③呼叫資源,但在傳送響應到客戶機前對其進行修改。
④阻止該資源呼叫,代之以轉到其他的資源,返回乙個特定的狀態**或生成替換輸出。
原理圖如下:
注意:在乙個
web
應用程式中可以註冊多個
filter
程式,每個
filter
程式都可以對乙個或一組
servlet
程式進行攔截。若有多個
filter
程式對某個
servlet
程式的訪問過程進行攔截,當針對該
servlet
的訪問請求到達時,
web
容器將把這多個
filter
程式組合成乙個
filter 鏈(
過濾器鏈)。
filter
鏈中各個
filter
的攔截順序與它們在應用程式的
web.xml
中對映的順序一致
三、
如何在
web程式中實現過濾器
1.實現步驟: 在
servlet api
中定義了三個介面類來開供開發人員編寫
filter
程式:filter, filterchain, filterconfig
。實現過濾器的步驟如下:
1). 編寫乙個
filter
程式,實現
filter
介面,並根據需要實現介面中過濾器生命週期的方法 2
).在web.xml
中註冊和對映過濾器
2.filter
的生命週期() 1
)init(filterconfig filterconfig)
:這是servlet
過濾器的初始化方法.
l在web
應用程式啟動時,
web
伺服器將根據
web.xml
檔案中的配置資訊來建立每個註冊的
filter
例項物件,並將其儲存在伺服器的記憶體中。
web容器(
servlet
容器)建立
filter
物件例項後,將立即呼叫該
filter
物件的init
方法。
linit
方法在filter
生命週期中僅執行一次,
servlet
容器在呼叫
init
方法時,會傳遞乙個包含
filter
的配置和執行環境的
filterconfig
物件(filterconfig
的用法和
servletconfig類似)
。利用filterconfig
物件可以得到
servletcontext
物件,以及部署描述符中配置的過濾器的初始化引數。 l
在這個方法中,可以丟擲
servletexception
異常,通知容器該過濾器不能正常工作。 2)
destroy()
:servlet
容器在解除安裝過濾器例項前呼叫該方法。該方法在
filter
的生命週期中僅執行一次。在這個方法中,可以釋放過濾器使用的資源.
3)dofilter(servletrequest request,servletresponse response, filterchain chain)類似於
servlet介面的
service()方法。當客戶端請求目標資源的時候,容器就會呼叫與這個目標資源相關聯的過濾器的
dofilter()方法。
l其中引數
request, response
為web
容器或filter
鏈的上乙個
filter
傳遞過來的請求和相應物件; l
引數chain
為代表當前
filter
鏈的物件,在特定的操作完成後,可以在當前
filter
物件的dofilter
方法內部需要呼叫
filterchain
物件的chain.dofilter(request,response)
方法才能把請求交付給
filter
鏈中的下乙個
filter
或者目標
servlet
程式去處理,也可以直接向客戶端返回響應資訊,或者利用
requestdispatcher
的forward()
和include()
方法,以及
的sendredirect()
方法將請求轉向到其他資源 3.
過濾器對請求的過濾 1)
servlet
容器建立乙個過濾器例項 2)
servlet
容器呼叫
init
方法,讀取過濾器的初始化引數 3)
servlet
容器呼叫
dofilter
方法,根據初始化引數的值
,判斷該請求是否合法 4)
如果該請求不合法則阻塞該請求 5)
如果該請求合法則呼叫
chain.dofilter
方法將該請求向後續傳遞 4.
過濾器對響應的過濾 1
)過濾器截獲客戶端的請求.2
)重新封裝
servletresponse
,在封裝後的
servletresponse
中提供使用者自定義的輸出流
.將請求向後續傳遞.3
)web
元件產生響應.4
)從封裝後的
servletresponse
中獲取使用者自定義的輸出流.5
)將響應內容通過使用者自定義的輸出流寫入到緩衝流中
.在緩衝流中修改響應的內容後清空緩衝流,輸出響應內容
.
傳智播客學習有感
來傳智播客學習幾個月了,學習的很差,為什麼呢,我曾經這麼回答過,如果乙個人曾經很輕鬆的賺過錢,然後某天他改行做程式設計了,那麼是一件很折磨人的事情,寫 絕對不是一件輕鬆的事情,很容易疲倦,也很容易煩躁不安,我在傳智播客學習了幾個月說真的學的很差,動手太差,只侷限於聽,導致的結果是做乙個簡單的html...
傳智播客mysql分頁的實現 傳智播客 分頁
整理了一宿,終於找到了頭緒,在頭腦還算清醒時,整理下分頁的筆記.我這個分頁用的是oracle的資料庫.他在查詢時涉及到了乙個偽列.table名為 employees.建立bean物件employee.屬性如下 private int employee id private string first ...
傳智播客學習筆記4 24
傳智播客學習筆記4.24 檢視中沒有資料 檢視中查詢語句儲存於資料字典中 如果通過檢視訪問資料,至少訪問系統兩次 實際工作時,需要站在使用者的角度去考慮 盡量不要對檢視進行dml操作 在檢視定義中,可以使用with read only選項來保證該檢視上不能進行dml操作 閃回技術 oracle 10...