過濾器、監聽器、攔截器的區別


過濾器

 

Servlet中的過濾器Filter是實現了javax.servlet.Filter接口的服務器端程序,主要的用途是過濾字符編碼、做一些業務邏輯判斷等。其工作原理是,只要你在web.xml文件配置好要攔截的客戶端請求,它都會幫你攔截到請求,此時你就可以對請求或響應(Request、Response)統一設置編碼,簡化操作;同時還可以進行邏輯判斷,如用戶是否已經登錄、有沒有權限訪問該頁面等等工作,它是隨你的web應用啟動而啟動的,只初始化一次,以后就可以攔截相關的請求,只有當你的web應用停止或重新部署的時候才能銷毀。

在javax.servlet.Filter接口中定義了3個方法:

void init(FilterConfig filterConfig) 用於完成過濾器的初始化

void destroy() 用於過濾器銷毀前,完成某些資源的回收

void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) 實現過濾功能,該方法對每個請求增加額外的處理

監聽器

Servlet的監聽器Listener,它是實現了javax.servlet.ServletContextListener接口的服務器端程序,它也是隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷毀。主要作用是:做一些初始化的內容添加工作、設置一些基本的內容、比如一些參數或者是一些固定的對象等等。

在javax.servlet.ServletContextListener接口中定義了2種方法:

void contextInitialized(ServletContextEvent sce) 監聽器的初始化

void contextDestroyed(ServletContextEvent sce) 監聽器銷毀

攔截器

攔截器是在面向切面編程中應用的,就是在你的service或者一個方法前調用一個方法,或者在方法后調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法后打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作。攔截器不是在web.xml配置的,比如struts在struts.xml配置,在springMVC在spring與springMVC整合的配置文件中配置。

在springmvc中,定義攔截器要實現HandlerInterceptor接口,並實現該接口中提供的三個方法

preHandle方法:進入Handler方法之前執行。可以用於身份認證、身份授權。比如如果認證沒有通過表示用戶沒有登陸,需要此方法攔截不再往下執行(return false),否則就放行(return true)。

postHandle方法:進入Handler方法之后,返回ModelAndView之前執行。可以看到該方法中有個modelAndView的形參。應用場景:從modelAndView出發:將公用的模型數據(比如菜單導航之類的)在這里傳到視圖,也可以在這里同一指定視圖。

afterCompletion方法:執行Handler完成之后執行。應用場景:統一異常處理,統一日志處理等。

在springmvc中,攔截器是針對具體的HandlerMapping進行配置的,也就是說如果在某個HandlerMapping中配置攔截,經過該 HandlerMapping映射成功的handler最終使用該攔截器。

 在網上查詢的過濾器和攔截器的區別,基本都是以下一模一樣的5行話。
1、攔截器是基於Java的反射機制的,而過濾器是基於函數回調
2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器
3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用
4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能
5、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次

 

執行順序:過濾前 - 攔截前 - Action處理 - 攔截后 -過濾后。個人認為過濾是一個橫向的過程,首先把客戶端提交的內容進行過濾(例如未登錄用戶不能訪問內部頁面的處理);過濾通過后,攔截器將檢查用戶提交數據的驗證,做一些前期的數據處理,接着把處理后的數據發給對應的Action;Action處理完成返回后,攔截器還可以做其他過程,再向上返回到過濾器的后續操作。

過濾器(Filter):當你有一堆東西的時候,你只希望選擇符合你要求的某一些東西。定義這些要求的工具,就是過濾器。
攔截器(Interceptor):在一個流程正在進行的時候,你希望干預它的進展,甚至終止它進行,這是攔截器做的事情。
監聽器(Listener):當一個事件發生的時候,你希望獲得這個事件發生的詳細信息,而並不想干預這個事件本身的進程,這就要用到監聽器。

 

context-param:就是一些需要初始化的配置,放入context-param中,從而被監聽器(這里特指org.springframework.web.context.ContextLoaderListener)監聽,然后加載;

監聽器(listener):就是對項目起到監聽的作用,它能感知到包括request(請求域),session(會話域)和applicaiton(應用程序)的初始化和屬性的變化;

過濾器(filter):就是對請求起到過濾的作用,它在監聽器之后,作用在servlet之前,對請求進行過濾;

servlet:就是對request和response進行處理的容器,它在filter之后執行,servlet其中的一部分就是controller層(標記為servlet_2),還包括渲染視圖層(標記為servlet_3)和進入controller之前系統的一些處理部分(servlet_1),另外我們把servlet開始的時刻標記為servlet_0,servlet結束的時刻標記為servlet_4。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM