1. 程式人生 > >攔截器,過濾器,監聽器各有什麼作用

攔截器,過濾器,監聽器各有什麼作用

1.背景介紹
        過濾器:依賴於servlet容器。在實現上基於函式回撥,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器例項只能在容器初始化時呼叫一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取的資料,比如:在過濾器中修改字元編碼;在過濾器中修改HttpServletRequest的一些引數,包括:過濾低俗文字、危險字元等

        攔截器:依賴於web框架,在SpringMVC中就是依賴於SpringMVC框架。在實現上基於Java的反射機制,屬於面向切面程式設計(AOP)的一種運用。由於攔截器是基於web框架的呼叫,因此可以使用Spring的依賴注入(DI)進行一些業務操作,同時一個攔截器例項在一個controller生命週期之內可以多次呼叫。但是缺點是隻能對controller請求進行攔截,對其他的一些比如直接訪問靜態資源的請求則沒辦法進行攔截處理。

web監聽器是一種Servlet中的特殊的類,它們能幫助開發者監聽web中的特定事件,比如ServletContext,HttpSession,ServletRequest的建立和銷燬;變數的建立、銷燬和修改等。可以在某些動作前後增加處理,實現監控。

2.知識剖析

Filter介面中有一個doFilter方法,當我們編寫好Filter,並配置對哪個web資源進行攔截後,WEB伺服器每次在呼叫web資源的service方法之前,
都會先呼叫一下filter的doFilter方法,因此,在該方法內編寫程式碼可達到如下目的:呼叫目標資源之前,讓一段程式碼執行。是否呼叫目標資源(即是否讓使用者訪問web資源)。呼叫目標資源之後,讓一段程式碼執行。
 web應用程式啟動時,web伺服器將建立Filter的例項物件,並呼叫其init方法,完成物件的初始化
功能,從而為後續的使用者請求作好攔截的準備工作,filter物件只會建立一次,init方法也只會執行一次。
  web容器呼叫destroy方法銷燬Filter。destroy方法在Filter的生命週期中僅執行一次。在destroy方法中,可以釋放過濾器使用的資源。

SpringMVC 中的Interceptor 攔截請求是通過HandlerInterceptor 來實現的。在SpringMVC 中定義一個Interceptor 非常簡單,主要有兩種方式,第一種方式是要定義的Interceptor類要實現了Spring 的HandlerInterceptor 介面,或者是這個類繼承實現了HandlerInterceptor 介面的類,HandlerInterceptor 介面中定義了三個方法,preHandle在執行控制器前執行、postHandle在渲染檢視之前執行、afterCompletion在渲染檢視之後執行,通過這三個方法來對使用者的請求進行攔截處理的。

 Listener 的作用是用於監聽 web應用的建立和銷燬以及在其上attribute發生的變化。除了對web應用的監聽外還能監聽session和request的生命週期以及他們的attribute發生的變化。 監聽器常用的用途:統計線上人數,利用HttpSessionLisener、載入初始化資訊:利用ServletContextListener、統計網站訪問量、實現訪問監控。

3.常見問題

1過濾器,監聽器,攔截器的執行順序

2:過濾器如何實現攔截

3攔截器和AOP是什麼關係

4.解決方案

1監聽器-過濾器-攔截器

2.

Filter介面中有一個doFilter方法,當開發人員編寫好Filter,並配置對哪個web資源進行攔截後,web伺服器在每次呼叫方法之前,都會先呼叫一下filter的doFilter方法,因此,可以達到以下目的:

呼叫目標之前,讓一段程式碼執行

是否呼叫目標資源(即是否讓使用者訪問web資源)

3AOP也是攔截器的一種,通常用在維護資料操作層,攔截器多用於驗證登陸狀態之類的。

5.編碼實戰

過濾器,監聽器,攔截器的配置

6.擴充套件思考

7.參考文獻

https://blog.csdn.net/xiaoyaotan_111/article/details/53818043
 https://www.cnblogs.com/w-wfy/p/6425357.html

8.更多討論