一、自定義攔截器
1、創(chuàng)建實(shí)現(xiàn)了HandlerInterceptor接口的類:重寫它的三個(gè)方法
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("first prehandler");
//如果return false的話業(yè)務(wù)方法不會(huì)執(zhí)行而直接反回
return false;
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("first posthandler");
}
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
//preHandler()方法return true的時(shí)候,afterCompletion()方法一定會(huì)執(zhí)行
System.out.println("first afterhandler");
}
}
2、在IOC容器中配置自定義的攔截器:有兩種配置方式,這種是全局的,就是說每個(gè)控制器方法執(zhí)行之前都會(huì)被該攔截器攔截,還有一種是針對(duì)某個(gè)請(qǐng)求的,只會(huì)攔截指定的請(qǐng)求
<mvc:interceptors>
<bean id="firstInterceptor" class="com.bdm.springmvc.interceptors.FirstInterceptor"></bean>
</mvc:interceptors>
3、攔截器可以有多個(gè):會(huì)先執(zhí)行上面的攔截器,且上面的攔截器只攔截請(qǐng)求/testInterceptor,下面的攔截器會(huì)攔截所有的請(qǐng)求
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/testInterceptor"/>
<bean id="secondInterceptor" class="com.bdm.springmvc.interceptors.SecondInterceptor"/>
</mvc:interceptor>
<bean id="firstInterceptor" class="com.bdm.springmvc.interceptors.FirstInterceptor"></bean>
</mvc:interceptors>
兩個(gè)攔截器的preHandle()方法的返回值都是true的時(shí)候所有方法的執(zhí)行順序:
①second preHandle
②first prehandler
③業(yè)務(wù)方法執(zhí)行
④first posthandler
⑤second postHandle
⑥first afterCompletion
⑦second afterCompletion
二、方法的執(zhí)行和執(zhí)行的順序
1、當(dāng)有一個(gè)自定義的攔截器時(shí):會(huì)先執(zhí)行攔截器的preHandle()方法,為業(yè)務(wù)方法的執(zhí)行做準(zhǔn)備,根據(jù)preHandle()方法的返回值決定是否繼續(xù)執(zhí)行,當(dāng)preHandle()方法的返回值為false時(shí),后續(xù)的方法(包括業(yè)務(wù)方法和攔截器的其余兩個(gè)方法)就不會(huì)執(zhí)行了,會(huì)導(dǎo)致程序的return,當(dāng)preHandle()方法的返回值為true時(shí),會(huì)接著執(zhí)行業(yè)務(wù)方法處理業(yè)務(wù)邏輯,然后執(zhí)行postHandle()方法將結(jié)果送去進(jìn)行渲染,最后執(zhí)行afterCompletion()方法進(jìn)行收尾工作
2、當(dāng)有多個(gè)自定義的攔截器方法時(shí):會(huì)根據(jù)在IOC容器中配置的先后順序執(zhí)行,先執(zhí)行第一個(gè)攔截器的preHandle()方法,根據(jù)第一個(gè)攔截器的preHandle()方法的返回值決定是否繼續(xù)執(zhí)行,當(dāng)?shù)谝粋€(gè)攔截器的preHandle()方法的返回值為false的時(shí)候,后續(xù)方法都將不會(huì)執(zhí)行,當(dāng)?shù)谝粋€(gè)攔截器的preHandle()方法的返回值為true的時(shí)候,再進(jìn)入第二個(gè)攔截器,執(zhí)行第二個(gè)攔截器的preHandle()方法,只有當(dāng)所有攔截器的preHandle()方法的返回值都為true的時(shí)候,業(yè)務(wù)方法才會(huì)執(zhí)行,如果一個(gè)攔截器的preHandle()方法的返回值為true時(shí),那么該攔截器的afterCompletion()方法也一定會(huì)執(zhí)行,如果所有攔截器的preHandle()方法的返回值都為true的時(shí)候,會(huì)先順序執(zhí)行完所有攔截器的preHandle()方法,然后執(zhí)行業(yè)務(wù)方法,接著逆序執(zhí)行postHandle()方法,最后逆序執(zhí)行afterCompletion()方法;當(dāng)有一個(gè)攔截器的preHandle()方法的返回值為false的時(shí)候,業(yè)務(wù)方法不會(huì)執(zhí)行,同時(shí)所有的postHandle()方法都不會(huì)執(zhí)行,但是preHandle()方法為true的攔截器的afterCompletion()方法會(huì)逆序執(zhí)行
底層原碼:
執(zhí)行postHandle時(shí)是逆序執(zhí)行的:
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺(tái),網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對(duì)作者和來源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請(qǐng)及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對(duì)此聲明的最終解釋權(quán)。