SpringMVC中攔截器的實(shí)現(xiàn)
SpringMVC 中的 Interceptor 攔截器是非常重要和相當(dāng)有用的,它的主要作用是攔截指定的用戶請(qǐng)求,并進(jìn)行相應(yīng)的預(yù)處理與后處理。
其攔截的時(shí)間點(diǎn)在“處理器映射器根據(jù)用戶提交的請(qǐng)求映射出了所要執(zhí)行的處理器類,并且也找到了要執(zhí)行該處理器類的處理器適配器,在處理器適配器執(zhí)行處理器之前”。
當(dāng)然,在處理器映射器映射出所要執(zhí)行的處理器類時(shí),已經(jīng)將攔截器與處理器組合為了一個(gè)處理器執(zhí)行鏈,并返回給了中央調(diào)度器。
攔截器和過(guò)濾器很像,但是又有比較大的區(qū)別
過(guò)濾器是servlet規(guī)范的一部分,任何javaweb工具都能夠使用。
過(guò)濾器基于回調(diào)函數(shù)。
攔截器是spring的AOP思想的具體應(yīng)用,攔截器是基于反射機(jī)制。
攔截器是springmvc自己的,只有springmvc框架的工程才能使用。
攔截器只會(huì)攔截訪問(wèn)的控制方法,對(duì)靜態(tài)資源,不走controller的資源是不用的。
攔截器可以獲取IOC容器中的各個(gè)bean,而過(guò)濾器就不行,這點(diǎn)很重要,在攔截器里注入一個(gè)service,可
以調(diào)用業(yè)務(wù)邏輯。
攔截器的實(shí)現(xiàn)
自定義攔截器,需要實(shí)現(xiàn) HandlerInterceptor 接口。而該接口中含有三個(gè)方法:
? preHandle(request,response, Object handler):
該方法在處理器方法執(zhí)行之前執(zhí)行。其返回值為 boolean,若為 true,則緊接著會(huì)執(zhí)行處理器方法,且會(huì)將 afterCompletion()方法放入到一個(gè)專門的方法棧中等待執(zhí)行。
? postHandle(request,response, Object handler,modelAndView):
該方法在處理器方法執(zhí)行之后執(zhí)行。處理器方法若最終未被執(zhí)行,則該方法不會(huì)執(zhí)行。
由于該方法是在處理器方法執(zhí)行完后執(zhí)行,且該方法參數(shù)中包含 ModelAndView,所以該方法可以修改處理器方法的處理結(jié)果數(shù)據(jù),且可以修改跳轉(zhuǎn)方向。
? afterCompletion(request,response, Object handler, Exception ex): 當(dāng) preHandle()方法返回 true 時(shí),會(huì)將該方法放到專門的方法棧中,等到對(duì)請(qǐng)求進(jìn)行響應(yīng)的所有
工作完成之后才執(zhí)行該方法。即該方法是在中央調(diào)度器渲染(數(shù)據(jù)填充)了響應(yīng)頁(yè)面之后執(zhí)行的,此時(shí)對(duì) ModelAndView 再操作也對(duì)響應(yīng)無(wú)濟(jì)于事。
afterCompletion 最后執(zhí)行的方法,清除資源,例如在 Controller 方法中加入數(shù)據(jù)
注冊(cè)攔截器:
package com.dongmu.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Interceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("攔截器在處理器方法執(zhí)行前攔截。"); return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("攔截器在處理器方法執(zhí)行后處理"); public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("攔截器一定會(huì)執(zhí)行的方法"); }
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.dongmu.interceptor.Interceptor"/> </mvc:interceptor> </mvc:interceptors>
當(dāng)有多個(gè)攔截器時(shí),形成攔截器鏈。攔截器鏈的執(zhí)行順序,與其注冊(cè)順序一致。需要再次強(qiáng)調(diào)一點(diǎn)的是,當(dāng)某一個(gè)攔截器的 preHandle()方法返回 true 并被執(zhí)行到時(shí),會(huì)向一個(gè)專門的方法棧中放入該攔截器的 afterCompletion()方法。
注意:每次通過(guò)servlet,也就是處理器controller的請(qǐng)求都會(huì)經(jīng)過(guò)攔截器。(指定路徑的情況下)
到此這篇關(guān)于SpringMVC的攔截器的文章就介紹到這了,更多相關(guān)SpringMVC攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于java實(shí)現(xiàn)斗地主代碼實(shí)例解析
這篇文章主要介紹了基于java實(shí)現(xiàn)斗地主代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源
咱們開發(fā)項(xiàng)目的過(guò)程中用到很多的開源數(shù)據(jù)庫(kù)鏈接池,比如druid、c3p0、BoneCP等等,本文主要介紹了SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Java實(shí)現(xiàn)分頁(yè)的幾種方法詳細(xì)解析
這篇文章主要介紹了Java實(shí)現(xiàn)分頁(yè)的幾種方法詳細(xì)解析,在Java中想實(shí)現(xiàn)分頁(yè)功能有幾種常用的方法,今天我們就來(lái)詳細(xì)解析一下,文中提供了解決思路和部分實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-11-11java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組
這篇文章主要介紹了java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Springboot處理CORS跨域請(qǐng)求的三種方法
這篇文章主要介紹了Springboot處理CORS跨域請(qǐng)求的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06關(guān)于logBack配置日志文件及編碼配置的問(wèn)題
這篇文章主要介紹了logBack配置日志文件及編碼配置的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07詳解Spring-Cloud2.0之Feign調(diào)用遠(yuǎn)程服務(wù)指南
這篇文章主要介紹了詳解Spring-Cloud2.0之Feign調(diào)用遠(yuǎn)程服務(wù)指南,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Java getResource()如何獲取class文件目錄位置
這篇文章主要介紹了Java getResource()如何獲取class文件目錄位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12