天天看點

Spring:SpringMVC 攔截器執行流程

作者:日拱一卒程式猿

一、監聽器、過濾器和攔截器對比

1、小服務程式(Servlet):處理Request請求和Response響應

2、過濾器(Filter):對Request請求起到過濾的作用,作用在Servlet之前,如果配置為/*可以對所有的資源通路(servlet、js/css靜态資源等)進行過濾處理

3、監聽器(Listener):實作了javax.servlet.ServletContextListener 接口的伺服器端元件,它随Web應用的啟動而啟動,隻初始化一次,然後會一直運作監視,随Web應用的停止而銷毀

作用一:做一些初始化工作,web應用中spring容器啟動ContextLoaderListener

作用二:監聽web中的特定事件,比如HttpSession,ServletRequest的建立和銷毀;變量的建立、銷毀和修改等。可以在某些動作前後增加處理,實作監控,比如統計線上人數,利用HttpSessionLisener等。

4、攔截器(Interceptor):是SpringMVC、Struts等表現層架構自己的,不會攔截jsp/html/css/image的通路等,隻會攔截通路的控制器方法(Handler)。

5、總結:

從配置的⻆度也能夠總結發現:serlvet、filter、listener是配置在web.xml中的,而interceptor是配置在表現層架構自己的配置檔案中的

  • 在Handler業務邏輯執行之前攔截一次
  • 在Handler邏輯執行完畢但未跳轉頁面之前攔截一次
  • 在跳轉頁面之後攔截一次
Spring:SpringMVC 攔截器執行流程

二、攔截器執行流程

在運作程式時,攔截器的執行是有一定順序的,該順序與配置檔案中所定義的攔截器的順序相關。 單個攔截器,在程式中的執行流程如下圖所:

Spring:SpringMVC 攔截器執行流程

1)程式先執行preHandle()方法,如果該方法的傳回值為true,則程式會繼續向下執行處理器中的方法,否則将不再向下執行。

2)在業務處理器(即控制器Controller類)處理完請求後,會執行postHandle()方法,然後會通過DispatcherServlet向用戶端傳回響應。

3)在DispatcherServlet處理完請求後,才會執行afterCompletion()方法。

三、多個攔截器的執行流程

多個攔截器(假設有兩個攔截器Interceptor1和Interceptor2,并且在配置檔案中, Interceptor1攔截器配置在前),在程式中的執行流程如下圖所:

Spring:SpringMVC 攔截器執行流程

從圖可以看出,當有多個攔截器同時工作時,它們的preHandle()方法會按照配置檔案中攔截器的配置順序執行,而它們的postHandle()方法和afterCompletion()方法則會按照配置順序的反序執行。