Interceptor
主要作用:攔截使用者請求,進行處理,比如判斷使用者登入情況、許可權驗證,只要針對Controller請求進行處理,是通過HandlerInterceptor。
Interceptor分兩種情況,一種是對會話的攔截,實現spring的HandlerInterceptor介面並註冊到mvc的攔截佇列中,其中preHandle()方法在呼叫Handler之前進行攔截(上圖步驟3),postHandle()方法在檢視渲染之前呼叫(上圖步驟5),**afterCompletion()**方法在返回相應之前執行;另一種是對方法的攔截,需要使用@Aspect註解,在每次呼叫指定方法的前、後進行攔截。
Filter
主要作用:過濾字元編碼、做一些業務邏輯判斷,主要用於對使用者請求進行預處理,同時也可進行邏輯判斷。
Filter在請求進入servlet容器執行service()方法之前就會經過filter過濾(上圖步驟1),不像Intreceptor一樣依賴於springmvc框架,只需要依賴於servlet。Filter啟動是隨WEB應用的啟動而啟動,只需要初始化一次,以後都可以進行攔截。
Filter有如下幾個種類:
- 使用者授權Filter:檢查使用者請求,根據請求過濾使用者非法請求;
- 日誌Filter:記錄某些特殊的使用者請求;
- 解碼Filter:對非標準編碼的請求解碼。
Filter和Interceptor的區別
- Filter是基於函式回撥(doFilter()方法)的,而Interceptor則是基於Java反射的(AOP思想)。
- Filter依賴於Servlet容器,而Interceptor不依賴於Servlet容器。
- Filter對幾乎所有的請求起作用,而Interceptor只能對action請求起作用。
- Interceptor可以訪問Action的上下文,值棧裡的物件,而Filter不能。
- 在action的生命週期裡,Interceptor可以被多次呼叫,而Filter只能在容器初始化時呼叫一次。
- Filter在過濾是隻能對request和response進行操作,而interceptor可以對request、response、handler、modelAndView、exception進行操作。