Intercepter
Spring Web MVC的處理器攔截器,類似于Servlet開發中的過濾器Filter,用于對處理器進行預處理和后處理,本質上也會AOP,把符合橫切關注點的所有功能都可以放入攔截器實現,Intercepter面向的是頁面處理Handler(Controller),允許開發人員自定義某一請求路徑上的處理程序執行鏈。
應用場景
日志記錄:記錄請求信息的日志,以便進行信息監控、信息統計、計算PV(Page View)等。
權限檢查:如登錄檢測,進入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面;
性能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完后記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);
通用行為:讀取cookie得到用戶信息并將用戶對象放入請求,從而方便后續流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都需要的即可使用攔截器實現。
HandlerInterceptor 接口
HandlerInterceptor 處理流程
正常處理流程
中斷流程
說明:
- 不同攔截器的執行順序
不同攔截器根據注冊到攔截器注冊器上的先后順序進行攔截
- 不同攔截器的相同handler的執行順序
- preHandler:根據注冊順序執行
- postHanadler:根據preHandler的逆序執行,即先執行的preHandler的攔截器后執行postHandler
- afterCompletion:同postHanadler,根據preHandler的逆序執行,即先執行的preHandler的攔截器后執行afterCompletion
- 同一攔截器不同handler的執行順序
如果preHandler返回true(不管postHanadler的結果,它本身返回值為void類型,也不管Controller是否正常執行完成),則afterCompletion一定會執行,否則afterCompletion不執行
- 不同攔截器的preHandler的失敗對其他攔截器的流程影響
本攔截器的preHandler的失敗只影響本攔截器的后續流程,而不影響其他攔截器的執行流程。
攔截器的使用示例
passportInterceptor攔截器的實現
HostHolder類的實現
passportInterceptor攔截器注冊