當前位置:
首頁 > 最新 > 過濾器和監聽器

過濾器和監聽器

一、過濾器

過濾器的基本功能是是Servletde的調用過程進行攔截,從而在Servlet處理響應及請求的過程中增加一些特定的功能。

當客戶端向伺服器資源發送請求時,會先被過濾器Filter攔截,之後再將處理後的請求轉發給真正的伺服器資源。同理,伺服器接收到求情之後做出響應,響應也會先被過濾器攔截。

創建一個index.jsp(發送請求的客戶端)

創建一個MyFilterServlet(處理請求的控制器)

在web.xml中配置此Servlet

創建一個MyFilter過濾器繼承Filter並且重寫此介面中的方法(攔截Servlet程序)

在web.xml中配置此Filter(與Servlet配置方法類似)

啟動結果:

啟動時自動初始化

進入index.jsp並且點擊超鏈接

然後查看控制台,可以發現

可以發現Filter可以對請求和響應都進行攔截,而且首先攔截請求,再放行,訪問到伺服器端(執行servlet服務端),最後攔截響應。

Filter映射

如果想攔截項目中的所有請求。可以使用通配符「*」,即在web.xml中的Filter配置中配置/*

其中「/」表示項目的根路徑,想到與Http://localhost:8888/FilterAndListener

還可以給通配符加上後綴,同時,只是多了個後綴,例如:

/*.do表示攔截所有以.do結尾的請求

還可以通過的子元素配置攔截特定的方式請求。

Filter鏈

原理就是為Web應用程序註冊多個Filter,對某一個請求/響應進行多次攔截。

當客戶端向伺服器資源發送請求時,會先被過濾器Filter1攔截,然後放行之後會被過濾器Filter2攔截,同樣放行之後再將處理後的請求轉發給真正的伺服器資源。同理,伺服器接收到求情之後做出響應,響應也會先被過濾器Filter1攔截-->放行,再被過濾器Filter2攔截-->放行。

再創建一個過濾器MyFilter2

配置web.xml

執行。

可以發現兩個Filter都初始化。

進入index.jsp並且點擊超鏈接

可以發現被攔截了兩次。第一次是Filter,第二次是Filter2(注意:過濾器執行的先後順序取決於在web.xml中配置的先後順序。先配置的先執行)

將service服務停止(tomcat)

發現執行了destroy

二、監聽器。

艦艇域對象的生命周期

原理就是Servlet API提供了ServletContextListener、HttpSessionListener、ServletRequestListener三個介面分別用來監聽ServletContext、HttpSession、ServletRequest三個域對象。當這三個域對象創建或銷毀時,就會自動觸發相應的監聽器介面。

下面用一個類同時實現三個監聽器介面。(即實現三個介面)

重寫其中的方法發現,每個監聽器有兩個方法。即每個監聽器有創建還有銷毀。

在web.xml中部署此監聽器:

(註:如果有多個監聽器則同過濾器,先配置的先執行)

創建一個index.jsp頁面和sessionInvalidate.jsp頁面用來測試監聽器

index.jsp頁面

sessionInvalidate.jsp頁面

部署並且啟動並且執行了contextInitialized()方法

(註:因為Web容器在啟動時會自動載入部署過的項目,並且為該項目創建對應的ServletContext對象,因此出發了監聽器中的contextInitialized()方法)

訪問index.jsp

(執行即發起請求,執行結束則銷毀請求)

單擊銷毀

查看控制台:

(註:單擊超鏈接跳轉新的頁面,即新的request請求,完成之後跳轉至sessionInvalidate.jsp頁面並且執行了session.invalidate()即銷毀了session。最後再銷毀request)

最後手動停止web服務

ServletContext對象銷毀完成

2.監聽域對象中屬性的變更

原理:

ServletContext、HttpSession、ServletRequest三個域對象都可以通過

setAttribute()和removeAttribute()等方法進行屬性的增加、替換(更改)和刪除操作。Servlet API也提供了ServletContextAttributeListener、

HttpSessionAttributeListeber、ServletRequestAttributeListener三個監聽器介面,用來監測這個三個域中的屬性變更。

新建attributeListener.jsp用於增加、替換、刪除屬性

創建用於監聽域對象屬性更變的監聽器(即創建一個類,並實現

ServletContextAttributeListener、HttpSessionAttributeListeber、

ServletRequestAttributeListener三個監聽器介面)

可以看出每個對象都有三個方法,分別用於增加,替換和刪除。

配置監聽器:

查看控制台:

3.感知HttpSession綁定的事件監聽器

在session域中保存的對象,可能會經歷四種狀態:

(1)將對象保存(綁定)在session域中

(2)從session域中刪除(解除綁定)該對象

(3)鈍化:隨著session持久化到硬碟等存儲設備中,即將對象和session一起從內存寫入硬碟等存儲設備中

(4)活化:對象隨著session從硬碟等存儲設備中恢復到內存中

Servlet API提供了HttpSessionBindingListener和HttpSessionActivationListener兩個監聽器(介面)專門用於監聽session域中的這四種狀態。

1.HttpSessionBindingListener介面

HttpSessionBindingListener介面提供了valueBound()和valueUnbound()兩個方法,分別用於艦艇Java對象綁定到HttpSession對象中和從HttpSession對象中解綁Java對象的兩個事件

創建一個類實現HttpSessionBindingListener介面並且重寫這兩個方法

創建HttpSessionBindingListener.jsp

(註:注意導包)

執行HttpSessionBindingListener.jsp

刷新頁面查看控制台

第二個BeanListener對象覆蓋了第一個BeanListener對象,因為是同一次會話,因此sessionId是相同的。

2.HttpSessionActivationListener介面

HttpSessionActivationListener介面的sessionWillPassivate()和SessionDidActicate()介面提供了鈍化和活化。

設置會話管理器(配置tomcat路徑下的/conf/context.xml)

創建一個類實現HttpSessionActivationListener介面並且重寫這兩個方法

編寫write.jsp實現鈍化

(註:注意導包)

編寫read.jsp實現活化

執行write.jsp可以發現自動創建名叫wanghuan的目錄

類型是session文件

查看控制台

執行read.jsp

查看控制台

(註:第一條列印為執行write.jsp時候列印)


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 溫爾昔昔 的精彩文章:

TAG:溫爾昔昔 |