JavaWeb中監聽器+過濾器+攔截器區別

1.前沿上一篇文章提到在web.xml中各個元素的執行順序是這樣的,context-param-->listener-->filter-->servlet; 而攔截器是在Spring MVC中配置的,如果從整個項目中看,一個servlet請求的執行過程就變成了這樣context-param-->listener-->filter-->servlet-->interceptor(指的是攔截器),爲什麼攔截器是在servlet執行之後,因爲攔截器本身就是在servlet內部的,下面把所學和所總結的用自己的描述整理出來~。另外本文的項目框架是基於上篇文章http://blog.csdn.net/Jintao_Ma/article/details/52892625 講述的框架,下載路徑:http://download.csdn.net/download/jintao_ma/9661038。

2.概念

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。

攔截器(interceptor):就是對請求和返回進行攔截,它作用在servlet的內部,具體來說有三個地方:

1)servlet_1和servlet_2之間,即請求還沒有到controller層

2)servlet_2和servlet_3之間,即請求走出controller層次,還沒有到渲染時圖層

3)servlet_3和servlet_4之間,即結束視圖渲染,但是還沒有到servlet的結束

它們之間的關係,可以用一張圖來表示:

3.使用原則

對整個流程清楚之後,然後就是各自的使用,在使用之前應該有一個使用規則,爲什麼這個說,因爲有些功能比如判斷用戶是否登錄,既可以用過濾器,也可以用攔截器,用哪一個纔是合理的呢?那麼如果有一個原則,使用起來就會更加合理。實際上這個原則是有的:

把整個項目的流程比作一條河,那麼監聽器的作用就是能夠聽到河流裏的所有聲音,過濾器就是能夠過濾出其中的魚,而攔截器則是攔截其中的部分魚,並且作標記。所以當需要監聽到項目中的一些信息,並且不需要對流程做更改時,用監聽器;當需要過濾掉其中的部分信息,只留一部分時,就用過濾器;當需要對其流程進行更改,做相關的記錄時用攔截器。
 

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