實(shí)現(xiàn)方式:
- 第一種方式是要定義的Interceptor類要實(shí)現(xiàn)了Spring的HandlerInterceptor 接口
- 第二種方式是繼承實(shí)現(xiàn)了HandlerInterceptor接口的類鳍徽,比如Spring已經(jīng)提供的實(shí)現(xiàn)了HandlerInterceptor接口的抽象類HandlerInterceptorAdapter
HandlerInterceptor 接口中三個(gè)方法:
preHandle():
這個(gè)方法在業(yè)務(wù)處理器處理請(qǐng)求之前被調(diào)用娄猫,SpringMVC 中的Interceptor 是鏈?zhǔn)降恼{(diào)用的,在一個(gè)應(yīng)用中或者說是在一個(gè)請(qǐng)求中可以同時(shí)存在多個(gè)Interceptor 魄衅。每個(gè)Interceptor 的調(diào)用會(huì)依據(jù)它的聲明順序依次執(zhí)行扇售,而且最先執(zhí)行的都是Interceptor 中的preHandle 方法翰铡,所以可以在這個(gè)方法中進(jìn)行一些前置初始化操作或者是對(duì)當(dāng)前請(qǐng)求的一個(gè)預(yù)處理勺鸦,也可以在這個(gè)方法中進(jìn)行一些判斷來決定請(qǐng)求是否要繼續(xù)進(jìn)行下去。該方法的返回值是布爾值Boolean 類型的浓镜,當(dāng)它返回為false 時(shí)溃列,表示請(qǐng)求結(jié)束,后續(xù)的Interceptor 和Controller 都不會(huì)再執(zhí)行膛薛;當(dāng)返回值為true 時(shí)就會(huì)繼續(xù)調(diào)用下一個(gè)Interceptor 的preHandle 方法听隐,如果已經(jīng)是最后一個(gè)Interceptor 的時(shí)候就會(huì)是調(diào)用當(dāng)前請(qǐng)求的Controller 方法。postHandle():
這個(gè)方法在當(dāng)前請(qǐng)求進(jìn)行處理之后哄啄,也就是Controller 方法調(diào)用之后執(zhí)行雅任,但是它會(huì)在DispatcherServlet 進(jìn)行視圖返回渲染之前被調(diào)用,所以我們可以在這個(gè)方法中對(duì)Controller 處理之后的ModelAndView 對(duì)象進(jìn)行操作咨跌。postHandle 方法被調(diào)用的方向跟preHandle 是相反的沪么,也就是說先聲明的Interceptor 的postHandle 方法反而會(huì)后執(zhí)行。afterCompletion():
該方法也是需要當(dāng)前對(duì)應(yīng)的Interceptor 的preHandle 方法的返回值為true 時(shí)才會(huì)執(zhí)行虑润。顧名思義成玫,該方法將在整個(gè)請(qǐng)求結(jié)束之后,也就是在DispatcherServlet 渲染了對(duì)應(yīng)的視圖之后執(zhí)行。這個(gè)方法的主要作用是用于進(jìn)行資源清理工作的苇本。
spring-MVC.xml的相關(guān)配置
<!-- 攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api/v1/machineInfo/author/**"/>
<bean class="com.yy.testi.nterceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>