初識servlet中過濾器

2021-09-01 07:26:57 字數 1411 閱讀 9481

對於web應用程式來說,過濾器是乙個駐留在伺服器端的web元件,它可以擷取客戶端與資源之間的請求與相應資訊,並對這些資訊進行過濾

執行順序是:當web伺服器接收到對資源檔案的請求時,先判斷是否有與該資源檔案關聯的過濾器,如果有,那麼容器講請求先交個過濾器進行處理,過濾器處理完後再轉交給目標資源。當目標資源對請求作出響應時,容器同樣會將響應先交給過濾器處理,最後再將響應發給客戶端。

當部署了多個過濾器時就組成了過濾器鏈,過濾器依次對請求做處理,交給目標資源,然後再按照相反的順序處理響應資訊,直到客戶端。

過濾器並不是必須將請求交給目標資源或下乙個過濾器,它可以自行處理請求,然後傳送響應到客戶端,或者將請求交給另乙個目標資源。

servlet容器對部署描述符中宣告的每乙個過濾器只會建立乙個例項。與servlet類似,容器將在同乙個過濾器例項上執行多個執行緒同時為多個請求服務,因此開發過濾器時也要注意執行緒安全問題。

以下由乙個例子來解釋過濾器和目標資源之間的處理順序:

a.jsp

<%

response.sendredirect("b.jsp");

system.out.println(3);

%>

b.jsp

<%

system.out.println(4);

%>

myfilter

system.out.println(1);

chain.dofilter(request,response);

system.out.println(2);

web.xml中對呼叫a、b頁面都設定了過濾器(預設request模式)

當在瀏覽器中輸入對a.jsp的訪問位址後,後台列印順序是1、3、2、1、4、2

這裡涉及到sendredirect的原理了,它其實是向瀏覽器傳送乙個特殊的header,然後由瀏覽器來做轉向,轉到指定的頁面(用sendredirect時瀏覽器的位址列上可以看到位址的變化。而用jsp:forword則不會),也就是說sendredirect相當於瀏覽器又向伺服器傳送了乙個新的請求,那麼就不難理解為何列印書序如上了。 

這裡,我們將a.jsp改為如下

<%

"b.jsp");

system.out.println(3);

%>

這樣一來列印順序就變了1、3、1、4、2、2。

為什麼會這樣呢?同樣要從jsp:forward的實現原理來分析,sendredirect方式相當於瀏覽器接收到了響應之後又向伺服器傳送了一次請求,所以相當於兩次請求,而jsp:forward方式則相當於方法呼叫,在執行當前檔案的過程中轉向執行目標檔案,兩個檔案(當前檔案和目標檔案)屬於同一次請求,最本質的特點就是兩次請求共享了reques物件和response物件

初識Servlet過濾器

web應用開發中過濾器以及功能 定義 過濾器其實是乙個程式,它先於與之相關的servlet或jsp頁面執行在伺服器上。過濾器可附加到乙個或多個servlet或jsp頁面上,並且可以檢查進入這資源的請求資訊 功能 是對 servlet 容器呼叫 servlet 的過程進行攔截,從而在 servlet ...

關於Servlet的過濾器

1 過濾器的作用?a.在客戶端的請求訪問後端資源之前,攔截這些請求 b.在伺服器的響應傳送回客戶端之前,處理這些響應 2 過濾器的種類?a.身份驗證過濾器 authentication filters b.資料壓縮過濾器 data compression filters c.加密過濾器 encryp...

servlet過濾器學習筆記

過濾器作用 預先處理需要訪問的頁面,比如登入檢測,編碼轉換等 基礎使用 傳統的xml方式需要在web.xml裡配置,配置方式與servlet類似 現在的annotation配置比較方便 分類,過濾器有五種 request 對請求進行攔截,具體攔截可以自行指定,也可以萬用字元指定,比如 do,但是如果...