SpringMvc servlet 攔截器 過濾器關系和區別及執行順序


過濾器和攔截器的區別:

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

2、過濾器是servlet規范規定的,只能用於web程序中,而攔截器是在spring容器中,它不依賴servlet容器。

3、過濾器可以攔截幾乎所有的請求(包含對靜態資源的請求),而攔截器只攔截action請求(不攔截靜態資源請求)。

4、濾器不能訪問action上下文、值棧里的對象,攔截器可以訪問action上下文、值棧里的對象。

5、在action的生命周期中,過濾器只能在容器初始化時被調用一次,攔截器可以多次被調用,而。

6、攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調用業務邏輯。

7、攔截器是被包裹在過濾器之中。

 

過濾器、攔截器、aop 順序

  攔截順序:filter—>Interceptor—->@Aspect -->Interceptor)

 

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

 

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

 

執行順序 : 

  SpringMVC的機制是由同一個Servlet來分發請求給不同的Controller,其實這一步是在Servlet的service()方法中執行的。所以過濾器、攔截器、service()方法,dispatc()方法的執行順序應該是這樣的

                                               

 

  

 

Springmvc的攔截器執行順序及各方法作用

  實現HandlerInterceptor接口或者繼承HandlerInterceptor的子類,比如Spring 已經提供的實現了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter ,下面講實現其接口的寫法,先看一下這個接口的三個方法.

PreHandle
  方法: preHandle: 顧名思義,該方法將在請求處理之前進行調用,在controller之前執行。SpringMVC 中的Interceptor 是鏈式的調用的,在一個應用中或者說是在一個請求中可以同時存在多個Interceptor 。每個Interceptor 的調用會依據它的聲明順序依次執行,而且最先執行的都是Interceptor 中的preHandle 方法,所以可以在這個方法中進行一些前置初始化操作或者是對當前請求的一個預處理,

  作用:比如說獲取cookie的值或者判斷是否已經登錄,也可以在這個方法中進行一些判斷來決定請求是否要繼續進行下去。該方法的返回值是布爾值Boolean 類型的,當它返回為false 時,表示請求結束,后續的Interceptor 和Controller 都不會再執行;當返回值為true 時就會繼續調用下一個Interceptor 的preHandle 方法,如果已經是最后一個Interceptor 的時候就會是調用當前請求的Controller 方法。

PostHandle

  方法 : postHandle:由preHandle 方法的解釋我們知道這個方法包括后面要說到的afterCompletion 方法都只能是在當前所屬的Interceptor 的preHandle 方法的返回值為true 時才能被調用。postHandle 方法,顧名思義就是在當前請求進行處理之后,也就是Controller 方法調用之后執行,但是它會在DispatcherServlet 進行視圖返回渲染之前被調用,所以我們可以在這個方法中對Controller 處理之后的ModelAndView 對象進行操作,比如說設置cookie,返回給前端。postHandle 方法被調用的方向跟preHandle 是相反的,也就是說先聲明的Interceptor 的postHandle 方法反而會后執行

AfterCompletion

  方法: afterCompletion:該方法也是需要當前對應的Interceptor 的preHandle 方法的返回值為true 時才會執行。顧名思義,該方法將在整個請求結束之后,也就是在DispatcherServlet 渲染了對應的視圖之后執行。這個方法的主要作用是用於進行資源清理工作的。

 


免責聲明!

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



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