SpringMVC攔截器快速掌握下篇
攔截器參數(shù)
前置處理方法
原始方法之前運行preHandle
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); return true; }
- request:請求對象
- response:響應(yīng)對象
- handler:被調(diào)用的處理器對象,本質(zhì)上是一個方法對象,對反射中的Method對象進(jìn)行了再包裝
使用request對象可以獲取請求數(shù)據(jù)中的內(nèi)容,如獲取請求頭的Content-Type
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String contentType = request.getHeader("Content-Type"); System.out.println("preHandle..."+contentType); return true; }
使用handler參數(shù),可以獲取方法的相關(guān)信息
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod hm = (HandlerMethod)handler; String methodName = hm.getMethod().getName();//可以獲取方法的名稱 System.out.println("preHandle..."+methodName); return true; }
后置處理方法
原始方法運行后運行,如果原始方法被攔截,則不執(zhí)行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); }
前三個參數(shù)和上面的是一致的。
modelAndView:如果處理器執(zhí)行完成具有返回結(jié)果,可以讀取到對應(yīng)數(shù)據(jù)與頁面信息,并進(jìn)行調(diào)整
因為咱們現(xiàn)在都是返回json數(shù)據(jù),所以該參數(shù)的使用率不高。
完成處理方法
攔截器最后執(zhí)行的方法,無論原始方法是否執(zhí)行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion"); }
前三個參數(shù)與上面的是一致的。
ex:如果處理器執(zhí)行過程中出現(xiàn)異常對象,可以針對異常情況進(jìn)行單獨處理
因為我們現(xiàn)在已經(jīng)有全局異常處理器類,所以該參數(shù)的使用率也不高。
這三個方法中,最常用的是preHandle,在這個方法中可以通過返回值來決定是否要進(jìn)行放行,我們可以把業(yè)務(wù)邏輯放在該方法中,如果滿足業(yè)務(wù)則返回true放行,不滿足則返回false攔截。
攔截器鏈配置
目前,我們在項目中只添加了一個攔截器,如果有多個,該如何配置?配置多個后,執(zhí)行順序是什么?
配置多個攔截器
創(chuàng)建攔截器類
實現(xiàn)接口,并重寫接口中的方法
@Component public class ProjectInterceptor2 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle...222"); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle...222"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion...222"); } }
配置攔截器類
@Configuration @ComponentScan({"com.nefu.controller"}) @EnableWebMvc //實現(xiàn)WebMvcConfigurer接口可以簡化開發(fā),但具有一定的侵入性 public class SpringMvcConfig implements WebMvcConfigurer { @Autowired private ProjectInterceptor projectInterceptor; @Autowired private ProjectInterceptor2 projectInterceptor2; @Override public void addInterceptors(InterceptorRegistry registry) { //配置多攔截器 registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*"); registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*"); } }
然后我們運行程序,觀察順序:
攔截器執(zhí)行的順序是和配置順序有關(guān)。就和前面所提到的運維人員進(jìn)入機房的案例,先進(jìn)后出。
- 當(dāng)配置多個攔截器時,形成攔截器鏈
- 攔截器鏈的運行順序參照攔截器添加順序為準(zhǔn)
- 當(dāng)攔截器中出現(xiàn)對原始處理器的攔截,后面的攔截器均終止運行
- 當(dāng)攔截器運行中斷,僅運行配置在前面的攔截器的afterCompletion操作
preHandle:與配置順序相同,必定運行
postHandle:與配置順序相反,可能不運行
afterCompletion:與配置順序相反,可能不運行。
這個順序不太好記,最終只需要把握住一個原則即可:以最終的運行結(jié)果為準(zhǔn)
到此這篇關(guān)于SpringMVC攔截器快速掌握下篇的文章就介紹到這了,更多相關(guān)SpringMVC攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談spring-boot-rabbitmq動態(tài)管理的方法
這篇文章主要介紹了淺談spring-boot-rabbitmq動態(tài)管理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12教你如何用Eclipse創(chuàng)建一個Maven項目
這篇文章主要介紹了教你如何用Eclipse創(chuàng)建一個Maven項目,文中有非常詳細(xì)的代碼示例,對正在入門Java的小伙伴們是非常有幫助的喲,需要的朋友可以參考下2021-05-05SpringBoot 如何使用RestTemplate來調(diào)用接口
這篇文章主要介紹了SpringBoot 如何使用RestTemplate來調(diào)用接口方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10