【java web】Filter Servlet Inteceptor Listener 區別與聯繫

概覽 

Servlet、Filter、Listener是配置到web.xml中,interceptor配置到spring.xml中,web.xml 的加載順序是:context-param > listener > filter > servlet 

                                              

一,Filter 過濾器

》概念

filter是一個可以複用的代碼片段,可以用來轉換HTTP請求、響應和頭信息。Filter不像Servlet,它不能產生一個請求或者響應,它只是修改對某一資源的請求,或者修改從某一的響應。

》生命週期

一定要實現javax.servlet包的Filter接口的三個方法init()、doFilter()、destroy(),空實現也行
 (1)、啓動服務器時加載過濾器的實例,並調用init()方法來初始化實例; 
 (2)、每一次請求時都只調用方法doFilter()進行處理; 
 (3)、停止服務器時調用destroy()方法,銷燬實例。

》場景

filter可用來進行字符編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等

二,Servlet  處理器

 

    

》概念

servlet是一種運行服務器端的java應用程序,具有獨立於平臺和協議的特性,並且可以動態的生成web頁面,用於客戶端請求與服務器響應。

》生命週期

servlet的生命週期始於它被裝入web服務器的內存時,並在web服務器終止或重新裝入servlet時結束。servlet一旦被裝入web服務器,一般不會從web服務器內存中刪除,直至web服務器關閉或重新結束。
 (1)、裝入:啓動服務器時加載Servlet的實例; 
 (2)、初始化:web服務器啓動時或web服務器接收到請求時,或者兩者之間的某個時刻啓動。初始化工作有init()方法負責執行完; 
 (3)、調用:從第一次到以後的多次訪問,都是隻調用doGet()或doPost()方法; 
 (4)、銷燬:停止服務器時調用destroy()方法,銷燬實例。 

》場景

 

三,Interceptor 過濾器

》概念

是在面向切面編程的,就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法,比如動態代理就是攔截器的簡單實現,在你調用方法前打印出字符串(或者做其它業務邏輯的操作),也可以在你調用方法後打印出字符串,甚至在你拋出異常的時候做業務邏輯的操作

》生命週期

 以spring的攔截器爲例,加載了spring.xml以後

(1)、初始化相應攔截器

(2)、當action請求來時調用intercept方法

preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,該方法將在請求處理之前進行調用。

  • SpringMVC 中的Interceptor 是鏈式的調用的,在一個應用中或者說是在一個請求中可以同時存在多個Interceptor 。每個Interceptor 的調用會依據它的聲明順序依次執行,而且最先執行的都是Interceptor 中的preHandle 方法,所以可以在這個方法中進行一些前置初始化操作或者是對當前請求的一個預處理,也可以在這個方法中進行一些判斷來決定請求是否要繼續進行下去。
  • 該方法的返回值是布爾值Boolean類型的,當它返回爲false 時,表示請求結束,後續Interceptor 和Controller 都不會再執行;當返回值爲true 時就會繼續調用下一個Interceptor 的preHandle 方法,如果已經是最後一個Interceptor 的時候就會是調用當前請求的Controller 方法。

postHandle (HttpServletRequest request, HttpServletResponse response, Objecthandle, ModelAndView modelAndView) 方法,preHandle 方法的返回值爲true 時纔會執行

  • postHandle 方法,在當前請求進行處理之後,也就是Controller 方法調用之後執行,會在DispatcherServlet 進行視圖返回渲染之前被調用,所以我們可以在這個方法中對Controller 處理之後的ModelAndView 對象進行操作。
  • postHandle 方法被調用的方向跟preHandle 是相反的,也就是說先聲明的Interceptor 的postHandle 方法反而會後執行

afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handle,Exception ex) 方法,preHandle 方法的返回值爲true 時纔會執行

  • 顧名思義,該方法將在整個請求結束之後,也就是在DispatcherServlet 渲染了對應的視圖之後執行。這個方法的主要作用是用於進行資源清理工作的。
     

(3)、服務器停止銷燬interceptor。

》場景

權限檢查:如是否已經登錄,或則對某些數據具有增刪改查等權限;

日誌記錄:可以記錄請求信息的日誌,以便進行信息監控,信息統計等;

性能監控:慢日誌等。

 

四,Listener 監聽器

             

》概念

從字面上可以看出listener主要用來監聽只用。通過listener可以監聽web服務器中某一個執行動作,並根據其要求作出相應的響應。通俗的語言說就是在application,session,request三個對象創建消亡或者往其中添加修改刪除屬性時自動執行代碼的功能組件

》監聽對象

第一類:ServletContext包括:ServletContextListener、ServletContextAttributeListener
第二類:HttpSession包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener
第三類:ServletRequest包括:ServletRequestListner、ServletRequestAttributeListener

》場景

監聽 Servlet 上下文用來初始化一些數據

監聽 HTTP Session 用來獲取當前在線的人數

監聽客戶端請求的 ServletRequest 對象來獲取用戶的訪問信息

               

 五,區別與聯繫

一,Filter與Interceptor區別

一,區別

1.使用範圍

  • Filter是Servlet中定義的,所以只能用於Web程序中;
  • Interceptor是Spring定義的,既可以用於web程序中,也可以用於其他程序中(Application、Swing);

2.實現機制

  • 攔截器是基於java的反射機制的
  • 過濾器是基於函數回調。

3.能使用資源不同

  • Filter只能提前配置在web.xml中,無法獲得更多的Spring的支持;
  • Interceptor是Spring中的一個組件,配置在Spring的上下文中,能與Spring裏的任何資源、對象(Service層、數據源、事務管理等)通過IOC注入到攔截器中,能與Spring其他組件完美結合;

4.使用的深度不同

  • Filter只能在Servlet前後起作用,即chain.doFilter(request,response)方法調用的前後;
  • Interceptor能深入方法的前後(preHandle、postHandle)、異常拋出前後等,因此攔截器具有更大的彈性;

5.初始化

  • Filter過濾器只能在容器初始化時被調用一次;
  • Interceptor沒有初始化方法,攔截器可以多次被調用;

二,聯繫

chain.doFilter(request, response);這個方法的調用作爲分水嶺。事實上調用Servlet的service()方法是在chain.doFilter(request, response);這個方法中進行的。其實從某種程度上來說攔截器是被包裹在過濾器之中的

SpringMVC的機制是由同一個Servlet(DispatcherServlet)來分發請求給不同的Controller,其實這一步是在Servlet的service()方法(也就是springmvc中的doService())中執行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章