過濾器和監聽器
一、過濾器
過濾器的基本功能是是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:溫爾昔昔 |