Spring MVC 攔截器 interceptor 用法詳解
Spring MVC-攔截器今天就是把有關(guān)攔截器的知識(shí)做一個(gè)總結(jié)。
1.攔截器概述
1.1 什么是攔截器?
Spring MVC中的攔截器(Interceptor)類(lèi)似于Servlet中的過(guò)濾器(Filter),它主要用于攔截用戶請(qǐng)求并作相應(yīng)的處理。例如通過(guò)攔截器可以進(jìn)行權(quán)限驗(yàn)證、記錄請(qǐng)求信息的日志、判斷用戶是否登錄等。要使用Spring MVC中的攔截器,就需要對(duì)攔截器類(lèi)進(jìn)行定義和配置。通常攔截器類(lèi)可以通過(guò)兩種方式來(lái)定義。
1.通過(guò)實(shí)現(xiàn)HandlerInterceptor接口,或繼承HandlerInterceptor接口的實(shí)現(xiàn)類(lèi)(如HandlerInterceptorAdapter)來(lái)定義。
2.通過(guò)實(shí)現(xiàn)WebRequestInterceptor接口,或繼承WebRequestInterceptor接口的實(shí)現(xiàn)類(lèi)來(lái)定義。
以實(shí)現(xiàn)HandlerInterceptor接口方式為例,自定義攔截器類(lèi)的代碼如下:
package com.mmm.interceptors;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** 創(chuàng)建自定義的攔截器01.務(wù)必實(shí)現(xiàn) HandlerInterceptor!02.我們使用的攔截器其實(shí)就是針對(duì)于Handler的攔截器===》處理器攔截器03.核心控制器中的HandleMapping返回的就是一個(gè)處理器執(zhí)行鏈 = Handler+ Interceptors(處理器攔截器)*/public class MyInterceptor implements HandlerInterceptor{/**** @param request* @param response* @param handler 打印出來(lái)com.mmm.controller.UserController@6225177c* @return* @throws Exception*** HandlerInterceptor接口中的三個(gè)方法:01.preHandle 如果返回值是false,則不會(huì)執(zhí)行后續(xù)的操作! 一個(gè)攔截器preHandle如果返回值是true 則會(huì)執(zhí)行下一個(gè)攔截器。。02.如果有多個(gè)攔截器,則之后攔截器中的所有方法都不會(huì)執(zhí)行!*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println('執(zhí)行了 攔截器1111中的 ===》preHandle');return true;}/*** 之后指定了對(duì)應(yīng)Handler中的方法之后 才執(zhí)行!* @param modelAndView 打印出來(lái) ModelAndView: reference to view with name ’success’; model is {welcome=恭喜您登錄成功}* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println('執(zhí)行了 攔截器1111中的===》postHandle');}/*** 只要是當(dāng)前攔截器中的preHandle返回true則此方法必須執(zhí)行!* @param handler 打印出來(lái)com.mmm.controller.UserController@6225177c* @param ex* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println('執(zhí)行了 攔截器1111的 ===》afterCompletion');}}
上述代碼中,自定義攔截器實(shí)現(xiàn)了HandlerInterceptor接口,并實(shí)現(xiàn)了接口中的三個(gè)方法:
preHandle() 方法:該方法會(huì)在控制器方法前執(zhí)行,其返回值表示是否中斷后續(xù)操作。當(dāng)其返回值為true時(shí),表示繼續(xù)向下執(zhí)行;當(dāng)其返回值為false時(shí),會(huì)中斷后續(xù)的所有操作(包括調(diào)用下一個(gè)攔截器和控制器類(lèi)中的方法執(zhí)行等)。
postHandle()方法:該方法會(huì)在控制器方法調(diào)用之后,且解析視圖之前執(zhí)行。可以通過(guò)此方法對(duì)請(qǐng)求域中的模型和視圖做出進(jìn)一步的修改。
afterCompletion()方法:該方法會(huì)在整個(gè)請(qǐng)求完成,即視圖渲染結(jié)束之后執(zhí)行。可以通過(guò)此方法實(shí)現(xiàn)一些資源清理、記錄日志信息等工作。
1.2 攔截器的配置
開(kāi)發(fā)攔截器就像開(kāi)發(fā)servlet或者filter一樣,都需要在配置文件進(jìn)行配置,配置代碼如下:
<!--配置自定義的攔截器--><mvc:interceptors><!--攔截器1--><mvc:interceptor><!--配置攔截器的作用路徑--><mvc:mapping path= '/user/**'/><!--攔截的路徑規(guī)則--><!--定義在<mvc:interceptor>下面的表示匹配指定路徑的請(qǐng)求才進(jìn)行攔截--><bean/></mvc:interceptor><!--攔截器2--><mvc:interceptor><mvc:mapping path='/user/**'/><!--攔截的路徑規(guī)則--><bean/></mvc:interceptor></mvc:interceptors>
上面的代碼中,<mvc:interceptors>元素用于配置一組攔截器,基子元素<bean>中定義的是全局?jǐn)r截器,它會(huì)攔截所有的請(qǐng)求;而<mvc:interceptor>元素中定義的是指定路徑的攔截器,它會(huì)對(duì)指定路徑下的請(qǐng)求生效。<mvc:interceptor>元素的子元素<mvc:mapping>用于配置攔截器作用的路徑,該路徑在其屬性path 中定義。如上述代碼中 path 的屬性值“/**” 表示攔截所有路徑,“/hello” 表示攔截所有以 “/hello” 結(jié)尾的路徑。如果在請(qǐng)求路徑中包含不需要攔截的內(nèi)容,還可以通過(guò)<mvc:exclude-mapping>元素進(jìn)行配置。注意:<mvc:interceptor>中的子元素必須按照上述代碼中的配置順序進(jìn)行編寫(xiě),即<mvc:mapping> <mvc:exclude-mapping> <bean>,否則文件會(huì)報(bào)錯(cuò)。
2. 攔截器的執(zhí)行流程
1.程序先執(zhí)行preHandle()方法,如果該方法的返回值為true,則程序會(huì)繼續(xù)向下執(zhí)行處理器中的方法,否則將不再向下執(zhí)行。
2.在業(yè)務(wù)處理器(即控制器Controller類(lèi))處理完請(qǐng)求后,會(huì)執(zhí)行postHandle()方法,然后會(huì)通過(guò)DispatcherServlet向客戶端返回響應(yīng)。
3.在DispatcherServlet處理完請(qǐng)求后,才會(huì)執(zhí)行afterCompletion()方法。
進(jìn)入了 login執(zhí)行了 攔截器1111中的 ===》preHandle執(zhí)行了 攔截器2222中的 ===》preHandle進(jìn)入了 main執(zhí)行了 攔截器2222中的===》postHandle執(zhí)行了 攔截器1111中的===》postHandle執(zhí)行了 攔截器2222的 ===》afterCompletion執(zhí)行了 攔截器1111的 ===》afterCompletion
到此這篇關(guān)于Spring MVC 攔截器 interceptor 用法詳解的文章就介紹到這了,更多相關(guān)Spring MVC 攔截器 interceptor 內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. Python如何實(shí)現(xiàn)感知器的邏輯電路2. Python getsizeof()和getsize()區(qū)分詳解3. JS實(shí)現(xiàn)表單中點(diǎn)擊小眼睛顯示隱藏密碼框中的密碼4. vue實(shí)現(xiàn)移動(dòng)端返回頂部5. asp讀取xml文件和記數(shù)6. python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進(jìn)行簡(jiǎn)單處理和分析7. 原生js實(shí)現(xiàn)的觀察者和訂閱者模式簡(jiǎn)單示例8. Python ellipsis 的用法詳解9. 在終端啟動(dòng)Python時(shí)報(bào)錯(cuò)的解決方案10. JS錯(cuò)誤處理與調(diào)試操作實(shí)例分析
