SpringMVC中攔截器的實現(xiàn)
SpringMVC 中的 Interceptor 攔截器是非常重要和相當(dāng)有用的,它的主要作用是攔截指定的用戶請求,并進(jìn)行相應(yīng)的預(yù)處理與后處理。
其攔截的時間點在“處理器映射器根據(jù)用戶提交的請求映射出了所要執(zhí)行的處理器類,并且也找到了要執(zhí)行該處理器類的處理器適配器,在處理器適配器執(zhí)行處理器之前”。
當(dāng)然,在處理器映射器映射出所要執(zhí)行的處理器類時,已經(jīng)將攔截器與處理器組合為了一個處理器執(zhí)行鏈,并返回給了中央調(diào)度器。
攔截器和過濾器很像,但是又有比較大的區(qū)別
過濾器是servlet規(guī)范的一部分,任何javaweb工具都能夠使用。
過濾器基于回調(diào)函數(shù)。
攔截器是spring的AOP思想的具體應(yīng)用,攔截器是基于反射機制。
攔截器是springmvc自己的,只有springmvc框架的工程才能使用。
攔截器只會攔截訪問的控制方法,對靜態(tài)資源,不走controller的資源是不用的。
攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可
以調(diào)用業(yè)務(wù)邏輯。
攔截器的實現(xiàn)
自定義攔截器,需要實現(xiàn) HandlerInterceptor 接口。而該接口中含有三個方法:
? preHandle(request,response, Object handler):
該方法在處理器方法執(zhí)行之前執(zhí)行。其返回值為 boolean,若為 true,則緊接著會執(zhí)行處理器方法,且會將 afterCompletion()方法放入到一個專門的方法棧中等待執(zhí)行。
? postHandle(request,response, Object handler,modelAndView):
該方法在處理器方法執(zhí)行之后執(zhí)行。處理器方法若最終未被執(zhí)行,則該方法不會執(zhí)行。
由于該方法是在處理器方法執(zhí)行完后執(zhí)行,且該方法參數(shù)中包含 ModelAndView,所以該方法可以修改處理器方法的處理結(jié)果數(shù)據(jù),且可以修改跳轉(zhuǎn)方向。
? afterCompletion(request,response, Object handler, Exception ex): 當(dāng) preHandle()方法返回 true 時,會將該方法放到專門的方法棧中,等到對請求進(jìn)行響應(yīng)的所有
工作完成之后才執(zhí)行該方法。即該方法是在中央調(diào)度器渲染(數(shù)據(jù)填充)了響應(yīng)頁面之后執(zhí)行的,此時對 ModelAndView 再操作也對響應(yīng)無濟(jì)于事。
afterCompletion 最后執(zhí)行的方法,清除資源,例如在 Controller 方法中加入數(shù)據(jù)


注冊攔截器:
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("攔截器一定會執(zhí)行的方法");
}
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.dongmu.interceptor.Interceptor"/>
</mvc:interceptor>
</mvc:interceptors>當(dāng)有多個攔截器時,形成攔截器鏈。攔截器鏈的執(zhí)行順序,與其注冊順序一致。需要再次強調(diào)一點的是,當(dāng)某一個攔截器的 preHandle()方法返回 true 并被執(zhí)行到時,會向一個專門的方法棧中放入該攔截器的 afterCompletion()方法。
注意:每次通過servlet,也就是處理器controller的請求都會經(jīng)過攔截器。(指定路徑的情況下)
到此這篇關(guān)于SpringMVC的攔截器的文章就介紹到這了,更多相關(guān)SpringMVC攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud動態(tài)配置刷新RefreshScope使用示例詳解
這篇文章主要為大家介紹了Spring Cloud動態(tài)配置刷新RefreshScope使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
springboot使用redis對單個對象進(jìn)行自動緩存更新刪除的實現(xiàn)
本文主要介紹了springboot使用redis對單個對象進(jìn)行自動緩存更新刪除的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
Java如何通過反射機制獲取數(shù)據(jù)類對象的屬性及方法
文章介紹了如何使用Java反射機制獲取類對象的所有屬性及其對應(yīng)的get、set方法,以及如何通過反射機制實現(xiàn)類對象的實例化,感興趣的朋友跟隨小編一起看看吧2025-01-01
Java?Hibernate中一對多和多對多關(guān)系的映射方式
Hibernate是一種Java對象關(guān)系映射框架,支持一對多和多對多關(guān)系的映射。一對多關(guān)系可以使用集合屬性和單向/雙向關(guān)聯(lián)來映射,多對多關(guān)系可以使用集合屬性和中間表來映射。在映射過程中,需要注意級聯(lián)操作、延遲加載、中間表的處理等問題2023-04-04
對dbunit進(jìn)行mybatis DAO層Excel單元測試(必看篇)
下面小編就為大家?guī)硪黄獙bunit進(jìn)行mybatis DAO層Excel單元測試(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
Feign如何使用protobuf的類作為參數(shù)調(diào)用
這篇文章主要介紹了Feign如何使用protobuf的類作為參數(shù)調(diào)用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Java基礎(chǔ)之Integer使用的注意事項及面試題
這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)之Integer使用注意事項及面試題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
基于struts2和hibernate實現(xiàn)登錄和注冊功能
這篇文章主要為大家詳細(xì)介紹了基于struts2和hibernate實現(xiàn)登錄和注冊功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10

