Intercepter
Spring Web MVC的處理器攔截器,類似于Servlet開發(fā)中的過濾器Filter,用于對處理器進行預處理和后處理,本質(zhì)上也會AOP,把符合橫切關(guān)注點的所有功能都可以放入攔截器實現(xiàn),Intercepter面向的是頁面處理Handler(Controller),允許開發(fā)人員自定義某一請求路徑上的處理程序執(zhí)行鏈。
應用場景
日志記錄:記錄請求信息的日志,以便進行信息監(jiān)控、信息統(tǒng)計、計算PV(Page View)等。
權(quán)限檢查:如登錄檢測,進入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面;
性能監(jiān)控:有時候系統(tǒng)在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完后記錄結(jié)束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);
通用行為:讀取cookie得到用戶信息并將用戶對象放入請求,從而方便后續(xù)流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都需要的即可使用攔截器實現(xiàn)。
HandlerInterceptor 接口
HandlerInterceptor 處理流程
正常處理流程

中斷流程

說明:
- 不同攔截器的執(zhí)行順序
不同攔截器根據(jù)注冊到攔截器注冊器上的先后順序進行攔截
- 不同攔截器的相同handler的執(zhí)行順序
- preHandler:根據(jù)注冊順序執(zhí)行
- postHanadler:根據(jù)preHandler的逆序執(zhí)行,即先執(zhí)行的preHandler的攔截器后執(zhí)行postHandler
- afterCompletion:同postHanadler,根據(jù)preHandler的逆序執(zhí)行,即先執(zhí)行的preHandler的攔截器后執(zhí)行afterCompletion
- 同一攔截器不同handler的執(zhí)行順序
如果preHandler返回true(不管postHanadler的結(jié)果,它本身返回值為void類型,也不管Controller是否正常執(zhí)行完成),則afterCompletion一定會執(zhí)行,否則afterCompletion不執(zhí)行
- 不同攔截器的preHandler的失敗對其他攔截器的流程影響
本攔截器的preHandler的失敗只影響本攔截器的后續(xù)流程,而不影響其他攔截器的執(zhí)行流程。
攔截器的使用示例
passportInterceptor攔截器的實現(xiàn)
HostHolder類的實現(xiàn)
passportInterceptor攔截器注冊





