詳解SpringMVC HandlerInterceptor攔截器的使用與參數
攔截器概念:
- 攔截器( Interceptor)是一種動態攔截方法調用的機制,請求處理過程解析
- 核心原理: AOP思想
- 攔截器鏈:多個攔截器按照一定的順序,對原始被調用功能進行增強
作用:
- 在指定的方法調用前後執行預先設定後的的代碼
- 阻止原始方法的執行
攔截器VS過濾器
歸屬不同: 過濾器屬於Servlet技術, 攔截器屬於SpringMVC技術攔截內容不同: 過濾器對所有訪問進行增強, 攔截器僅針對SpringMVC的訪問進行增強
攔截器執行流程:
自定義攔截器開發過程:
實現HandlerInterceptor接口
//自定義攔截器需要實現HandleInterceptor接口 public class MyInterceptor implements HandlerInterceptor { //前置處理方法:原始方法之前執行 @Override public boolean preHandle(HttpServletRequest request, //請求對象 HttpServletResponse response, //響應對象 Object handler) // 被調用的處理器對象,本質是一個方法對象,對反射中的Method對象進行瞭再包裝,對方法進行封裝加強,操作原始對象, throws Exception { System.out.println("前置運行"); //返回值為false將攔截原始處理器的運行,也就是是否放行,如果是false後面的代碼不會運行,如果是true就繼續執行下面的代碼 //如果配置多攔截器,返回值為false將終止當前攔截器後面配置的攔截器的運行 return true; } //後置處理方法:原始方法運行後運行,如果原始方法被攔截,則不執行 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) // 如果處理器執行完成具有返回結果,可以讀取到對應數據與頁面信息進行調整 throws Exception { System.out.println("後置運行"); } // 完成處理方法:攔截器最後執行的方法,無論原始方法是否執行 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) // 如果處理器執行過程中出現異常對象,可以針對異常情況進行單獨處理 throws Exception { System.out.println("完成運行"); } //三個方法的運行順序為 preHandle -> postHandle -> afterCompletion //如果preHandle返回值為false,三個方法僅運行preHandle }
攔截器配置項:
<mvc:interceptors> <!--開啟具體的攔截器的使用,可以配置多個--> <mvc:interceptor> <!--設置攔截器的攔截路徑,支持*通配--> <!--/** 表示攔截所有映射--> <!--/* 表示攔截所有/開頭的映射--> <!--/user/* 表示攔截所有/user/開頭的映射--> <!--/user/add* 表示攔截所有/user/開頭,且具體映射名稱以add開頭的映射--> <!--/user/*All 表示攔截所有/user/開頭,且具體映射名稱以All結尾的映射--> <mvc:mapping path="/*"/> <mvc:mapping path="/**"/> <mvc:mapping path="/handleRun*"/> <!--設置攔截排除的路徑,配置/**或/*,達到快速配置的目的--> <mvc:exclude-mapping path="/b*"/> <!--指定具體的攔截器類 bean標簽(ref標簽)隻能配置一個 ref:引用bean的 --> <bean class="com.itzhuzhu.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
多攔截器配置:
運行順序:配置在前,則執行在前。
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/showPage"/> <bean class="com.itzhuzhu.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/showPage"/> <bean class="com.itzhuzhu.interceptor.MyInterceptor2"/> </mvc:interceptor> </mvc:interceptors> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/showPage"/> <bean class="com.itzhuzhu.interceptor.MyInterceptor3"/> </mvc:interceptor> </mvc:interceptors>
多攔截器執行順序:
責任鏈模式
責任鏈模式是一種行為模式
特征:
沿著一條預先設定的任務鏈順序執行,每個節點具有獨立的工作任務
優勢:
- 獨立性:隻關註當前節點的任務,對其他任務直接放行到下一節點
- 隔離性:具備鏈式傳遞特征,無需知曉整體鏈路結構,隻需等待請求到達後進行處理即可
- 靈活性:可以任意修改鏈路結構動態新增或刪減整體鏈路責任
- 解耦:將動態任務與原始任務解耦
弊端:
- 鏈路過長時,處理效率低下
- 可能存在節點上的循環引用現象,造成死循環,導致系統崩潰
到此這篇關於詳解SpringMVC HandlerInterceptor攔截器的使用與參數的文章就介紹到這瞭,更多相關SpringMVC HandlerInterceptor攔截器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringMVC攔截器創建配置及執行順序
- 詳解Spring MVC的攔截器與異常處理機制
- Java Spring攔截器案例詳解
- SpringMVC攔截器超詳細解讀
- SpringMVC實現文件上傳與下載、攔截器、異常處理器等功能