SpringBoot之攔截器原始碼分析

一 什麼是攔截器

在執行目標函式前,對請求進行預處理的元件。

二 攔截器的作用

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,原始碼如下

SpringBoot之攔截器原始碼分析

往集合存入自定義攔截器例項

SpringBoot之攔截器原始碼分析

執行攔截器例項preHandle函式

SpringBoot之攔截器原始碼分析

執行攔截器例項postHandle函式