史上最經典的SpringMVC攔截器原理講解

設計模式 技術 編程界的小學生 編程界的小學生 2017-11-03

攔截器好比web開發中的利器,它能幫我們進行統一的日誌管理、權限的攔截等等。

應用場景

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

2、權限檢查:如登陸檢測,進入處理器檢測是否登陸,如果沒有直接返回到登陸頁面。

3、性能監控:典型的是慢日誌。

HandlerInterceptor

史上最經典的SpringMVC攔截器原理講解

攔截器適配器HandlerInterceptorAdapter

有時候我們可能只需要實現三個回調方法中的某一個,如果實現HandlerInterceptor接口的話,三個方法必須實現,不管你需不需要,此時spring提供了一個HandlerInterceptorAdapter適配器(種適配器設計模式的實現),允許我們只實現需要的回調方法。

史上最經典的SpringMVC攔截器原理講解

這樣在我們業務中比如要記錄系統日誌,日誌肯定是在afterCompletion之後記錄的,否則中途失敗了,也記錄了,那就扯淡了。一定是程序正常跑完後,我們記錄下那些對數據庫做個增刪改的操作日誌進數據庫。所以我們只需要繼承HandlerInterceptorAdapter,並重寫afterCompletion一個方法即可,因為preHandle默認是true。

運行流程圖

史上最經典的SpringMVC攔截器原理講解

運行流程總結如下:

1、攔截器執行順序是按照Spring配置文件中定義的順序而定的。

2、會先按照順序執行所有攔截器的preHandle方法,一直遇到return false為止,比如第二個preHandle方法是return false,則第三個以及以後所有攔截器都不會執行。若都是return true,則按順序加載完preHandle方法。

3、然後執行主方法(自己的controller接口),若中間拋出異常,則跟return false效果一致,不會繼續執行postHandle,只會倒序執行afterCompletion方法。

4、在主方法執行完業務邏輯(頁面還未渲染數據)時,按倒序執行postHandle方法。若第三個攔截器的preHandle方法return false,則會執行第二個和第一個的postHandle方法和afterCompletion(postHandle都執行完才會執行這個,也就是頁面渲染完數據後,執行after進行清理工作)方法。(postHandle和afterCompletion都是倒序執行)

正常流程Demo

史上最經典的SpringMVC攔截器原理講解

史上最經典的SpringMVC攔截器原理講解

史上最經典的SpringMVC攔截器原理講解

史上最經典的SpringMVC攔截器原理講解

<mvc:mapping path="/**"/>需要攔截的路徑,這裡匹配所有。這裡的配置順序將是攔截器執行順序。

輸出結果:

史上最經典的SpringMVC攔截器原理講解

post和after是倒序的!!!!

中斷流程Demo

將SyslogInterceptor3的preHandle方法返回false。其他不變,再看輸出結果

史上最經典的SpringMVC攔截器原理講解

發現沒有了post,post方法一個都沒有輸出。不僅如此,你的主程序代碼(xxx.controller的一個接口)都不會被執行,所以只要遇到return false,則直接進行after清理工作,post和自己主程序代碼都將被略過。


今天就講到這裡,共同進步!歡迎點贊!不喜勿噴~~

相關推薦

推薦中...