攔截器好比web開發中的利器,它能幫我們進行統一的日誌管理、權限的攔截等等。
應用場景
1、日誌記錄,可以記錄請求信息的日誌,以便進行信息監控、信息統計等。
2、權限檢查:如登陸檢測,進入處理器檢測是否登陸,如果沒有直接返回到登陸頁面。
3、性能監控:典型的是慢日誌。
HandlerInterceptor
攔截器適配器HandlerInterceptorAdapter
有時候我們可能只需要實現三個回調方法中的某一個,如果實現HandlerInterceptor接口的話,三個方法必須實現,不管你需不需要,此時spring提供了一個HandlerInterceptorAdapter適配器(種適配器設計模式的實現),允許我們只實現需要的回調方法。
這樣在我們業務中比如要記錄系統日誌,日誌肯定是在afterCompletion之後記錄的,否則中途失敗了,也記錄了,那就扯淡了。一定是程序正常跑完後,我們記錄下那些對數據庫做個增刪改的操作日誌進數據庫。所以我們只需要繼承HandlerInterceptorAdapter,並重寫afterCompletion一個方法即可,因為preHandle默認是true。
運行流程圖
運行流程總結如下:
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
<mvc:mapping path="/**"/>
需要攔截的路徑,這裡匹配所有。這裡的配置順序將是攔截器執行順序。
輸出結果:
post和after是倒序的!!!!
中斷流程Demo
將SyslogInterceptor3的preHandle方法返回false。其他不變,再看輸出結果
發現沒有了post,post方法一個都沒有輸出。不僅如此,你的主程序代碼(xxx.controller的一個接口)都不會被執行,所以只要遇到return false,則直接進行after清理工作,post和自己主程序代碼都將被略過。
今天就講到這裡,共同進步!歡迎點贊!不喜勿噴~~