Spring MVC 攔截器 interceptor 用法詳解
Spring MVC-攔截器
今天就是把有關(guān)攔截器的知識做一個(gè)總結(jié)。
1.攔截器概述
1.1 什么是攔截器?
Spring MVC中的攔截器(Interceptor)類似于Servlet中的過濾器(Filter),它主要用于攔截用戶請求并作相應(yīng)的處理。例如通過攔截器可以進(jìn)行權(quán)限驗(yàn)證、記錄請求信息的日志、判斷用戶是否登錄等。
要使用Spring MVC中的攔截器,就需要對攔截器類進(jìn)行定義和配置。通常攔截器類可以通過兩種方式來定義。
1.通過實(shí)現(xiàn)HandlerInterceptor接口,或繼承HandlerInterceptor接口的實(shí)現(xiàn)類(如HandlerInterceptorAdapter)來定義。
2.通過實(shí)現(xiàn)WebRequestInterceptor接口,或繼承WebRequestInterceptor接口的實(shí)現(xiàn)類來定義。
以實(shí)現(xiàn)HandlerInterceptor接口方式為例,自定義攔截器類的代碼如下:
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í)就是針對于Handler的攔截器===》處理器攔截器 03.核心控制器中的HandleMapping返回的就是一個(gè) 處理器執(zhí)行鏈 = Handler+ Interceptors(處理器攔截器) */ public class MyInterceptor implements HandlerInterceptor{ /** * * @param request * @param response * @param handler 打印出來com.mmm.controller.UserController@6225177c * @return * @throws Exception * * * HandlerInterceptor接口中的三個(gè)方法: 01.preHandle 如果返回值是false,則不會執(zhí)行后續(xù)的操作! 一個(gè)攔截器 preHandle如果返回值是true 則會執(zhí)行下一個(gè)攔截器。。 02.如果有多個(gè)攔截器,則之后攔截器中的所有方法都不會執(zhí)行! */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("執(zhí)行了 攔截器1111中的 ===》preHandle"); return true; } /** * 之后指定了對應(yīng)Handler中的方法之后 才執(zhí)行! * @param modelAndView 打印出來 ModelAndView: reference to view with name 'success'; model is {welcome=恭喜您登錄成功} * @throws Exception */ @Override public 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 打印出來com.mmm.controller.UserController@6225177c * @param ex * @throws Exception */ @Override public 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() 方法:該方法會在控制器方法前執(zhí)行,其返回值表示是否中斷后續(xù)操作。當(dāng)其返回值為true時(shí),表示繼續(xù)向下執(zhí)行;
當(dāng)其返回值為false時(shí),會中斷后續(xù)的所有操作(包括調(diào)用下一個(gè)攔截器和控制器類中的方法執(zhí)行等)。
postHandle()方法:該方法會在控制器方法調(diào)用之后,且解析視圖之前執(zhí)行??梢酝ㄟ^此方法對請求域中的模型和視圖做出進(jìn)一步的修改。
afterCompletion()方法:該方法會在整個(gè)請求完成,即視圖渲染結(jié)束之后執(zhí)行。可以通過此方法實(shí)現(xiàn)一些資源清理、記錄日志信息等工作。
1.2 攔截器的配置
開發(fā)攔截器就像開發(fā)servlet或者filter一樣,都需要在配置文件進(jìn)行配置,配置代碼如下:
<!--配置自定義的攔截器--> <mvc:interceptors> <!--攔截器1--> <mvc:interceptor> <!--配置攔截器的作用路徑--> <mvc:mapping path= "/user/**"/><!--攔截的路徑規(guī)則--> <!--定義在<mvc:interceptor>下面的表示匹配指定路徑的請求才進(jìn)行攔截--> <bean/> </mvc:interceptor> <!--攔截器2--> <mvc:interceptor> <mvc:mapping path="/user/**"/><!--攔截的路徑規(guī)則--> <bean/> </mvc:interceptor> </mvc:interceptors>
上面的代碼中,<mvc:interceptors>元素用于配置一組攔截器,基子元素<bean>中定義的是全局?jǐn)r截器,它會攔截所有的請求;而<mvc:interceptor>元素中定義的是指定路徑的攔截器,它會對指定路徑下的請求生效。<mvc:interceptor>元素的子元素<mvc:mapping>用于配置攔截器作用的路徑,該路徑在其屬性path 中定義。如上述代碼中 path 的屬性值“/**” 表示攔截所有路徑,“/hello” 表示攔截所有以 “/hello” 結(jié)尾的路徑。如果在請求路徑中包含不需要攔截的內(nèi)容,還可以通過<mvc:exclude-mapping>元素進(jìn)行配置。
注意:<mvc:interceptor>中的子元素必須按照上述代碼中的配置順序進(jìn)行編寫,即<mvc:mapping> <mvc:exclude-mapping> <bean>,否則文件會報(bào)錯(cuò)。
2. 攔截器的執(zhí)行流程
1.程序先執(zhí)行preHandle()方法,如果該方法的返回值為true,則程序會繼續(xù)向下執(zhí)行處理器中的方法,否則將不再向下執(zhí)行。
2.在業(yè)務(wù)處理器(即控制器Controller類)處理完請求后,會執(zhí)行postHandle()方法,然后會通過DispatcherServlet向客戶端返回響應(yīng)。
3.在DispatcherServlet處理完請求后,才會執(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系
- 詳解Java的Hibernate框架中的Interceptor和Collection
- Spring security用戶URL權(quán)限FilterSecurityInterceptor使用解析
- 分享Angular http interceptors 攔截器使用(推薦)
- spring boot加入攔截器Interceptor過程解析
- Springboot+redis+Interceptor+自定義annotation實(shí)現(xiàn)接口自動(dòng)冪等
- SpringBoot中使用Filter和Interceptor的示例代碼
- 詳解Retrofit Interceptor(攔截器) 攔截請求并做相關(guān)處理
- Spring interceptor攔截器配置及用法解析
相關(guān)文章
Java實(shí)現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法,結(jié)合實(shí)例形式分析了java創(chuàng)建微信公眾號自定義菜單的具體步驟、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-10-10Java線性結(jié)構(gòu)中的雙向鏈表實(shí)現(xiàn)原理
這篇文章將給大家詳細(xì)講解雙向鏈表的內(nèi)容,尤其是會通過代碼來進(jìn)行鏈表的操作,文中的代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-07-07SpringBoot集成FTP文件服務(wù)器簡單應(yīng)用方式
這篇文章主要介紹了SpringBoot集成FTP文件服務(wù)器簡單應(yīng)用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07解決java.lang.ClassNotFoundException: com.mysql.cj.jdbc.D
這篇文章主要介紹了解決java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05詳解Spring Boot使用redis實(shí)現(xiàn)數(shù)據(jù)緩存
本篇文章主要介紹了詳解Spring Boot使用redis實(shí)現(xiàn)數(shù)據(jù)緩存,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04SpringBoot中@Transiactional注解沒有效果的解決
這篇文章主要介紹了SpringBoot中@Transiactional注解沒有效果的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java并發(fā)程序刺客之假共享的原理及復(fù)現(xiàn)
前段時(shí)間在各種社交平臺“雪糕刺客”這個(gè)詞比較火,而在并發(fā)程序中也有一個(gè)刺客,那就是假共享。本文將通過示例詳細(xì)講解假共享的原理及復(fù)現(xiàn),需要的可以參考一下2022-08-08java通過Idea遠(yuǎn)程一鍵部署springboot到Docker詳解
這篇文章主要介紹了java通過Idea遠(yuǎn)程一鍵部署springboot到Docker詳解,Idea是Java開發(fā)利器,springboot是Java生態(tài)中最流行的微服務(wù)框架,docker是時(shí)下最火的容器技術(shù),那么它們結(jié)合在一起會產(chǎn)生什么化學(xué)反應(yīng)呢?的相關(guān)資料2019-06-06