傳智播客學習之Servlet過濾器

2021-05-18 06:08:10 字數 4369 閱讀 7996

近日,學習異常緊張,馮老師為了讓我們提前感受專案的緊張氣氛,同時為了提高我們的專案感覺,**質量和速度,每天給我們布置了不少的任務,並在我們的要求下不斷從專案中抽出部分模組讓我們利用業餘時間來完成,所以最近睡眠質量明顯下降,有時為了搞清一段程式的原理,不斷地去翻閱底層源**,分析底層的過程是痛苦的,但是每當通過底層**弄清原理的時候總是有一種說不出的幸福感,但是有時候也會將自己繞進去出不來,導致凌晨兩三點大腦一直處於極度興奮,最後的結果發現聽課質量有些下降,為了更好的吸收老是上課的精華,給自己想了乙個方式,那就是記筆記,我發現這是乙個不錯的學習方法,不僅在聽課質量方面有了明顯的提高,也為自己課下複習提供了乙個非常好的大綱,基本不會落下任何乙個知識點,同時可以隨手記下自己沒能理解的地方,需要查閱資料的地方,這樣一天下來,感覺收穫頗豐啊!今天就和大家分享一下我的

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...