詳解SpringMVC?HandlerInterceptor攔截器的使用與參數(shù)
攔截器概念:
- 攔截器( Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,請(qǐng)求處理過程解析
- 核心原理: AOP思想
- 攔截器鏈:多個(gè)攔截器按照一定的順序,對(duì)原始被調(diào)用功能進(jìn)行增強(qiáng)
作用:
- 在指定的方法調(diào)用前后執(zhí)行預(yù)先設(shè)定后的的代碼
- 阻止原始方法的執(zhí)行
攔截器VS過濾器
歸屬不同: 過濾器屬于Servlet技術(shù), 攔截器屬于SpringMVC技術(shù)攔截內(nèi)容不同: 過濾器對(duì)所有訪問進(jìn)行增強(qiáng), 攔截器僅針對(duì)SpringMVC的訪問進(jìn)行增強(qiáng)
攔截器執(zhí)行流程:
自定義攔截器開發(fā)過程:
實(shí)現(xiàn)HandlerInterceptor接口
//自定義攔截器需要實(shí)現(xiàn)HandleInterceptor接口 public class MyInterceptor implements HandlerInterceptor { //前置處理方法:原始方法之前執(zhí)行 @Override public boolean preHandle(HttpServletRequest request, //請(qǐng)求對(duì)象 HttpServletResponse response, //響應(yīng)對(duì)象 Object handler) // 被調(diào)用的處理器對(duì)象,本質(zhì)是一個(gè)方法對(duì)象,對(duì)反射中的Method對(duì)象進(jìn)行了再包裝,對(duì)方法進(jìn)行封裝加強(qiáng),操作原始對(duì)象, throws Exception { System.out.println("前置運(yùn)行"); //返回值為false將攔截原始處理器的運(yùn)行,也就是是否放行,如果是false后面的代碼不會(huì)運(yùn)行,如果是true就繼續(xù)執(zhí)行下面的代碼 //如果配置多攔截器,返回值為false將終止當(dāng)前攔截器后面配置的攔截器的運(yùn)行 return true; } //后置處理方法:原始方法運(yùn)行后運(yùn)行,如果原始方法被攔截,則不執(zhí)行 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) // 如果處理器執(zhí)行完成具有返回結(jié)果,可以讀取到對(duì)應(yīng)數(shù)據(jù)與頁面信息進(jìn)行調(diào)整 throws Exception { System.out.println("后置運(yùn)行"); } // 完成處理方法:攔截器最后執(zhí)行的方法,無論原始方法是否執(zhí)行 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) // 如果處理器執(zhí)行過程中出現(xiàn)異常對(duì)象,可以針對(duì)異常情況進(jìn)行單獨(dú)處理 throws Exception { System.out.println("完成運(yùn)行"); } //三個(gè)方法的運(yùn)行順序?yàn)? preHandle -> postHandle -> afterCompletion //如果preHandle返回值為false,三個(gè)方法僅運(yùn)行preHandle }
攔截器配置項(xiàng):
<mvc:interceptors> <!--開啟具體的攔截器的使用,可以配置多個(gè)--> <mvc:interceptor> <!--設(shè)置攔截器的攔截路徑,支持*通配--> <!--/** 表示攔截所有映射--> <!--/* 表示攔截所有/開頭的映射--> <!--/user/* 表示攔截所有/user/開頭的映射--> <!--/user/add* 表示攔截所有/user/開頭,且具體映射名稱以add開頭的映射--> <!--/user/*All 表示攔截所有/user/開頭,且具體映射名稱以All結(jié)尾的映射--> <mvc:mapping path="/*"/> <mvc:mapping path="/**"/> <mvc:mapping path="/handleRun*"/> <!--設(shè)置攔截排除的路徑,配置/**或/*,達(dá)到快速配置的目的--> <mvc:exclude-mapping path="/b*"/> <!--指定具體的攔截器類 bean標(biāo)簽(ref標(biāo)簽)只能配置一個(gè) ref:引用bean的 --> <bean class="com.itzhuzhu.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
多攔截器配置:
運(yùn)行順序:配置在前,則執(zhí)行在前。
<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>
多攔截器執(zhí)行順序:
責(zé)任鏈模式
責(zé)任鏈模式是一種行為模式
特征:
沿著一條預(yù)先設(shè)定的任務(wù)鏈順序執(zhí)行,每個(gè)節(jié)點(diǎn)具有獨(dú)立的工作任務(wù)
優(yōu)勢(shì):
- 獨(dú)立性:只關(guān)注當(dāng)前節(jié)點(diǎn)的任務(wù),對(duì)其他任務(wù)直接放行到下一節(jié)點(diǎn)
- 隔離性:具備鏈?zhǔn)絺鬟f特征,無需知曉整體鏈路結(jié)構(gòu),只需等待請(qǐng)求到達(dá)后進(jìn)行處理即可
- 靈活性:可以任意修改鏈路結(jié)構(gòu)動(dòng)態(tài)新增或刪減整體鏈路責(zé)任
- 解耦:將動(dòng)態(tài)任務(wù)與原始任務(wù)解耦
弊端:
- 鏈路過長(zhǎng)時(shí),處理效率低下
- 可能存在節(jié)點(diǎn)上的循環(huán)引用現(xiàn)象,造成死循環(huán),導(dǎo)致系統(tǒng)崩潰
到此這篇關(guān)于詳解SpringMVC HandlerInterceptor攔截器的使用與參數(shù)的文章就介紹到這了,更多相關(guān)SpringMVC HandlerInterceptor攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java語言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP本地文件管理模塊實(shí)現(xiàn)(9)
這篇文章主要為大家詳細(xì)介紹了Java語言實(shí)現(xiàn)簡(jiǎn)單FTP軟件,F(xiàn)TP本地文件管理模塊的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Dubbo服務(wù)校驗(yàn)參數(shù)的解決方案
這篇文章主要介紹了Dubbo服務(wù)如何優(yōu)雅的校驗(yàn)參數(shù),Dubbo框架本身是支持參數(shù)校驗(yàn)的,同時(shí)也是基于JSR303去實(shí)現(xiàn)的,今天通過示例代碼介紹下詳細(xì)實(shí)現(xiàn)過程,需要的朋友可以參考下2022-03-03解決Spring導(dǎo)出可以運(yùn)行的jar包問題
最近需要解決Maven項(xiàng)目導(dǎo)入可執(zhí)行的jar包的問題,如果項(xiàng)目不包含Spring,那么使用mvn assembly:assembly即可,這篇文章主要介紹了Spring導(dǎo)出可以運(yùn)行的jar包,需要的朋友可以參考下2023-03-03JAVA Iterator 轉(zhuǎn)成 List 的操作
這篇文章主要介紹了JAVA Iterator 轉(zhuǎn)成 List 的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12springboot項(xiàng)目中后端接收前端傳參的方法示例詳解
這篇文章主要介紹了springboot項(xiàng)目中一些后端接收前端傳參的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06