SpringMVC中攔截器的實現(xiàn)
SpringMVC 中的 Interceptor 攔截器是非常重要和相當有用的,它的主要作用是攔截指定的用戶請求,并進行相應的預處理與后處理。
其攔截的時間點在“處理器映射器根據(jù)用戶提交的請求映射出了所要執(zhí)行的處理器類,并且也找到了要執(zhí)行該處理器類的處理器適配器,在處理器適配器執(zhí)行處理器之前”。
當然,在處理器映射器映射出所要執(zhí)行的處理器類時,已經(jīng)將攔截器與處理器組合為了一個處理器執(zhí)行鏈,并返回給了中央調(diào)度器。
攔截器和過濾器很像,但是又有比較大的區(qū)別
過濾器是servlet規(guī)范的一部分,任何javaweb工具都能夠使用。
過濾器基于回調(diào)函數(shù)。
攔截器是spring的AOP思想的具體應用,攔截器是基于反射機制。
攔截器是springmvc自己的,只有springmvc框架的工程才能使用。
攔截器只會攔截訪問的控制方法,對靜態(tài)資源,不走controller的資源是不用的。
攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可
以調(diào)用業(yè)務邏輯。
攔截器的實現(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): 當 preHandle()方法返回 true 時,會將該方法放到專門的方法棧中,等到對請求進行響應的所有
工作完成之后才執(zhí)行該方法。即該方法是在中央調(diào)度器渲染(數(shù)據(jù)填充)了響應頁面之后執(zhí)行的,此時對 ModelAndView 再操作也對響應無濟于事。
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>
當有多個攔截器時,形成攔截器鏈。攔截器鏈的執(zhí)行順序,與其注冊順序一致。需要再次強調(diào)一點的是,當某一個攔截器的 preHandle()方法返回 true 并被執(zhí)行到時,會向一個專門的方法棧中放入該攔截器的 afterCompletion()方法。
注意:每次通過servlet,也就是處理器controller的請求都會經(jīng)過攔截器。(指定路徑的情況下)
到此這篇關(guān)于SpringMVC的攔截器的文章就介紹到這了,更多相關(guān)SpringMVC攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot配置默認HikariCP數(shù)據(jù)源
咱們開發(fā)項目的過程中用到很多的開源數(shù)據(jù)庫鏈接池,比如druid、c3p0、BoneCP等等,本文主要介紹了SpringBoot配置默認HikariCP數(shù)據(jù)源,具有一定的參考價值,感興趣的可以了解一下2023-11-11java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組
這篇文章主要介紹了java如何將Object數(shù)組轉(zhuǎn)換為指定類型數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08詳解Spring-Cloud2.0之Feign調(diào)用遠程服務指南
這篇文章主要介紹了詳解Spring-Cloud2.0之Feign調(diào)用遠程服務指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01Java getResource()如何獲取class文件目錄位置
這篇文章主要介紹了Java getResource()如何獲取class文件目錄位置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12