1.定義
定義攔截器,實(shí)現(xiàn)HandlerInterceptor接口,接口中實(shí)現(xiàn)三個(gè)方法.
2.攔截器配置
-
針對(duì)HandlerMapping進(jìn)行的攔截器設(shè)置:
springmvc的攔截器是針對(duì)HandlerMapping進(jìn)行攔截設(shè)置.如果在某個(gè)HandlerMapping中配置攔截器,經(jīng)過該HandlerMapping映射成功的handler最終才使用該攔截器.
麻煩,不推薦使用.
-
針對(duì)全局的攔截器:
springmvc配置類似全局的攔截器,springmvc的框架會(huì)將配置的類似全局的攔截器注入到每個(gè)HandlerMapping中,
<!--全局?jǐn)r截器-->
<mvc:interceptors>
<!--多個(gè)攔截器順序執(zhí)行-->
<mvc:interceptor>
<!--/**表示攔截所有的url包括子url-->
<mvc:mapping path="/**"/>
<bean class="cn.myjava.ssm.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
3.測(cè)試總結(jié),(假定有兩個(gè)攔截器,且A在B前面)
* 兩個(gè)攔截器都放行:
preHandle方法按順序執(zhí)行.
postHandle和afterCompletion逆向執(zhí)行.
* 攔截器A放行,B不放行:
攔截器A放行,攔截器B的preHandle才會(huì)執(zhí)行.
攔截器B的preHandle不放行,攔截器B的postHandle和afterCompletion不會(huì)執(zhí)行.
只要有一個(gè)攔截器攔截不放行,postHandler不會(huì)執(zhí)行.
*兩個(gè)攔截器都不放行
只有A的preHandle方法執(zhí)行,其他都不執(zhí)行.
總結(jié):
比如寫一個(gè)日志的處理攔截器,需要該攔截器preHandle一定要放行,且將它放在攔截器鏈中第一個(gè)位置.
登錄認(rèn)證攔截器,放在攔截器鏈接中的第一位置,僅次于日志.
權(quán)限校驗(yàn),放在登錄認(rèn)證之后.
4.三個(gè)攔截器方法的總結(jié):
* preHandel
進(jìn)入Handler方法之前執(zhí)行.
用于身份認(rèn)證,身份授權(quán)等...
* postHandle
進(jìn)入Handler方法之后,返回modelAndView之前執(zhí)行
應(yīng)用場(chǎng)景從modelAndView出發(fā),放一些通用的各種模型和數(shù)據(jù)和視圖啥的.
* afterHandle
執(zhí)行Handler完成執(zhí)行此方法
統(tǒng)一的異常處理,統(tǒng)一的日志處理,