一 什麼是攔截器
在執行目標函式前,對請求進行預處理的元件。
二 攔截器的作用
1 登入驗證 2 許可權驗證 3 token驗證
三 自定義攔截器原始碼分析
1 自定義攔截器
package com。example。demo;import org。springframework。web。servlet。HandlerInterceptor;import org。springframework。web。servlet。ModelAndView;import javax。servlet。http。HttpServletRequest;import javax。servlet。http。HttpServletResponse;public class TestHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System。out。println(“preHandle ”); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System。out。println(“postHandle ”); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System。out。println(“afterCompletion ”); }}
2 註冊攔截器
package com。example。demo;import org。springframework。context。annotation。Configuration;import org。springframework。web。servlet。config。annotation。InterceptorRegistry;import org。springframework。web。servlet。config。annotation。WebMvcConfigurer;@Configurationpublic class TestWebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry。addInterceptor(new TestHandlerInterceptor())。addPathPatterns(“/**”); }}
3 自定義攔截器原始碼分析
3。1 當請求傳送到服務端,SpringBoot執行DispatcherServlet例項的doDispatch函式,當執行getHandler函式,向集合中存放HandlerIntercepter子類例項。接著執行mappedHandler。applyPreHandle(processedRequest, response)迴圈遍歷HandlerIntercepter子類例項函式preHandle,當有自定義攔截器時,就會被執行到。當執行完目標函式後,會再執行mappedHandler。applyPostHandle(processedRequest, response, mv); 倒序遍歷攔截器例項函式postHandle。異常會執行triggerAfterCompletion倒序遍歷攔截器例項的函式afterCompletion,原始碼如下
往集合存入自定義攔截器例項
執行攔截器例項preHandle函式
執行攔截器例項postHandle函式