SpringMVC Interceptor攔截器使用教程
SpringMVC中的攔截器用于攔截控制器方法的執(zhí)行,執(zhí)行在Controller前后,和視圖渲染完成后。如下圖所示:
一、創(chuàng)建攔截器
繼承HandlerInterceptor 接口,并實(shí)現(xiàn)其中的方法
public class FirstInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("FirstInterceptor===>preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("FirstInterceptor===>postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("FirstInterceptor===>afterCompletion"); } }
SpringMVC中的攔截器有三個抽象方法:
preHandle:控制器方法執(zhí)行之前執(zhí)行preHandle(),其boolean類型的返回值表示是否攔截或放行,返回true為放行,即調(diào)用控制器方法;返回false表示攔截,即不調(diào)用控制器方法 postHandle:控制器方法執(zhí)行之后執(zhí)行postHandle() afterComplation:處理完視圖和模型數(shù)據(jù),渲染視圖完畢之后執(zhí)行afterComplation()
二、Spring配置文件中設(shè)置
<mvc:interceptors> <bean class="com.rzg.interceptor.FirstInterceptor"></bean> </mvc:interceptors>
上面的配置等價(jià)與下面
<bean id="firstInterceptor" class="com.rzg.interceptor.FirstInterceptor"></bean> <mvc:interceptors> <ref bean="firstInterceptor"/> </mvc:interceptors>
如果只在mvc:interceptors中配置一個攔截器,那么所有的請求都經(jīng)過攔截器。以上配置的請求結(jié)果如下:
FirstInterceptor===>preHandle
FirstInterceptor===>postHandle
FirstInterceptor===>afterCompletion
如果要對部分控制器進(jìn)行攔截,可以設(shè)置設(shè)置interceptor
。以下配置將攔截所有的/*請求,例如/hello 、/abc ,但是不攔截/abc/cde。如果要攔截任意請求,使用/**
<bean id="firstInterceptor" class="com.rzg.interceptor.FirstInterceptor"></bean> <!-- 攔截器的設(shè)置--> <mvc:interceptors> <mvc:interceptor> <!--攔截的請求 --> <mvc:mapping path="/*"/> <!-- 在mapping中排除以下攔截路徑--> <mvc:exclude-mapping path="/hello2"/> <ref bean="firstInterceptor"/> </mvc:interceptor> </mvc:interceptors>
結(jié)果:
請求/hello FirstInterceptor===>preHandle
FirstInterceptor===>postHandle
FirstInterceptor===>afterCompletion
請求/hello2 不經(jīng)過攔截器
三、設(shè)置多個攔截器
兩個攔截器FirstInterceptor、SecondInterceptor。
配置文件中配置:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.rzg.interceptor.FirstInterceptor"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.rzg.interceptor.SecondInterceptor"/> </mvc:interceptor> </mvc:interceptors>
請求結(jié)果:
FirstInterceptor===>preHandle
SecondInterceptor===>preHandle
SecondInterceptor===>postHandle
FirstInterceptor===>postHandle
SecondInterceptor===>afterCompletion
FirstInterceptor===>afterCompletion
若每個攔截器的preHandle()都返回true
此時(shí)多個攔截器的執(zhí)行順序和攔截器在SpringMVC的配置文件的配置順序有關(guān):
preHandle()會按照配置的順序執(zhí)行,而postHandle()和afterComplation()會按照配置的反序執(zhí)行
若某個攔截器的preHandle()返回了false
preHandle()返回false和它之前的攔截器的preHandle()都會執(zhí)行,postHandle()都不執(zhí)行,返回false的攔截器之前的攔截器的afterComplation()會執(zhí)行
將SecondInterceptor 攔截器 preHandle 中返回 false
public class SecondInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("SecondInterceptor===>preHandle"); return false; }
測試結(jié)果:
FirstInterceptor===>preHandle
SecondInterceptor===>preHandle
FirstInterceptor===>afterCompletio
到此這篇關(guān)于SpringMVC Interceptor攔截器使用教程的文章就介紹到這了,更多相關(guān)SpringMVC Interceptor內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java設(shè)計(jì)模式之實(shí)現(xiàn)對象池模式示例分享
對象池模式經(jīng)常用在頻繁創(chuàng)建、銷毀對象(并且對象創(chuàng)建、銷毀開銷很大)的場景,比如數(shù)據(jù)庫連接池、線程池、任務(wù)隊(duì)列池等。本代碼簡單,沒有限制對象池大小2014-02-02Java的外部類為什么不能使用private和protected進(jìn)行修飾的講解
今天小編就為大家分享一篇關(guān)于Java的外部類為什么不能使用private和protected進(jìn)行修飾的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04java并發(fā)編程synchronized底層實(shí)現(xiàn)原理
這篇文章主要介紹了java并發(fā)編程synchronized底層實(shí)現(xiàn)原理2022-02-02Spring Boot實(shí)現(xiàn)對文件進(jìn)行壓縮下載功能
在Web應(yīng)用中,文件下載功能是一個常見的需求,特別是當(dāng)你需要提供用戶下載各種類型的文件時(shí),本文將演示如何使用Spring Boot框架來實(shí)現(xiàn)一個簡單而強(qiáng)大的文件下載功能,需要的朋友跟隨小編一起學(xué)習(xí)吧2023-09-09java servlet結(jié)合mysql搭建java web開發(fā)環(huán)境
之前寫過一篇 servlet+oracle的文章,但是那是因?yàn)楣居锌赡芙幽敲匆粋€項(xiàng)目,然后我當(dāng)時(shí)也比較閑,所以隨便學(xué)了下,那玩意是白去研究了,因?yàn)楣竞竺娌]接到那項(xiàng)目。2015-12-12Java NIO.2 使用Path接口來監(jiān)聽文件、文件夾變化
Java7對NIO進(jìn)行了大的改進(jìn),新增了許多功能,接下來通過本文給大家介紹Java NIO.2 使用Path接口來監(jiān)聽文件、文件夾變化 ,需要的朋友可以參考下2019-05-05Java進(jìn)階學(xué)習(xí):jar打包詳解
Java進(jìn)階學(xué)習(xí):jar打包詳解...2006-12-12idea 查看一個類的所有子類以及子類的子類并以層級關(guān)系顯示
這篇文章主要介紹了idea 查看一個類的所有子類以及子類的子類并以層級關(guān)系顯示,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02MyBatis如何處理MySQL字段類型date與datetime
這篇文章主要介紹了MyBatis如何處理MySQL字段類型date與datetime問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01java Spring Boot 配置redis pom文件操作
這篇文章主要介紹了java Spring Boot 配置redis pom文件操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07