攔截器比如web開發中的利器,它能幫咱們進行統一的日誌管理、權限的攔截等等。web
應用場景spring
一、日誌記錄,能夠記錄請求信息的日誌,以便進行信息監控、信息統計等。數據庫
二、權限檢查:如登錄檢測,進入處理器檢測是否登錄,若是沒有直接返回到登錄頁面。設計模式
三、性能監控:典型的是慢日誌。mvc
HandlerInterceptorapp
攔截器適配器HandlerInterceptorAdapterpost
有時候咱們可能只須要實現三個回調方法中的某一個,若是實現HandlerInterceptor接口的話,三個方法必須實現,無論你需不須要,此時spring提供了一個HandlerInterceptorAdapter適配器(種適配器設計模式的實現),容許咱們只實現須要的回調方法。性能
這樣在咱們業務中好比要記錄系統日誌,日誌確定是在afterCompletion以後記錄的,不然中途失敗了,也記錄了,那就扯淡了。必定是程序正常跑完後,咱們記錄下那些對數據庫作個增刪改的操做日誌進數據庫。因此咱們只須要繼承HandlerInterceptorAdapter,並重寫afterCompletion一個方法便可,由於preHandle默認是true。設計
運行流程圖3d
運行流程總結以下:
一、攔截器執行順序是按照Spring配置文件中定義的順序而定的。
二、會先按照順序執行全部攔截器的preHandle方法,一直遇到return false爲止,好比第二個preHandle方法是return false,則第三個以及之後全部攔截器都不會執行。若都是return true,則按順序加載完preHandle方法。
三、而後執行主方法(本身的controller接口),若中間拋出異常,則跟return false效果一致,不會繼續執行postHandle,只會倒序執行afterCompletion方法。
四、在主方法執行完業務邏輯(頁面還未渲染數據)時,按倒序執行postHandle方法。若第三個攔截器的preHandle方法return false,則會執行第二個和第一個的postHandle方法和afterCompletion(postHandle都執行完纔會執行這個,也就是頁面渲染完數據後,執行after進行清理工做)方法。(postHandle和afterCompletion都是倒序執行)
正常流程Demo
<mvc:mapping path="/**"/>
須要攔截的路徑,這裏匹配全部。這裏的配置順序將是攔截器執行順序。
輸出結果:
post和after是倒序的!!!!
中斷流程Demo
將SyslogInterceptor3的preHandle方法返回false。其餘不變,再看輸出結果
發現沒有了post,post方法一個都沒有輸出。不只如此,你的主程序代碼(xxx.controller的一個接口)都不會被執行,因此只要遇到return false,則直接進行after清理工做,post和本身主程序代碼都將被略過。