目錄
攔截器基本概念
一 單個攔截器的執行
1 創建攔截器
2 SpringMVC配置,并指定攔截路徑。
3 運行結果展示:
二 多個攔截器的執行順序
三 攔截器與過濾器的區別
攔截器基本概念
SpringMVC內置攔截器機制,允許在請求被目標方法處理的前后進行攔截,執行一些額外操作;比如權限驗證、日志記錄、數據共享等。
作用對象:controller(處理請求)
使用步驟:
- 實現HandlerInterceptor接口的組件即可成為攔截器
- 創建WebMvcConfigurer組件,并配置攔截器的攔截路徑。
- 查看執行順序效果:preHandke=>目標方法=>postHandle=>afterCompletion
一 單個攔截器的執行
1 創建攔截器
這里的返回值如果是false將會將方法攔截,只會執行preHandle這一個方法
package org.example.springmvc.interceptor;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Component//攔截器需要配置指定攔截的請求
public class myHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");// 放行return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}
}
2 SpringMVC配置,并指定攔截路徑。
package org.example.springmvc.config;import org.example.springmvc.interceptor.myHandlerInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;// 對SpringMVC的底層進行一些配置
// 需要實現一個接口WebMvcConfigurer
@Configuration
public class MySpringMVCConfig implements WebMvcConfigurer {private final myHandlerInterceptor myHandler;public MySpringMVCConfig(myHandlerInterceptor myHandler) {this.myHandler = myHandler;}//添加攔截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 攔截所有請求registry.addInterceptor(myHandler).addPathPatterns("/**");}}
3 運行結果展示:
總結:
Spring MVC攔截器通過靈活的三個方法鉤子,為開發者提供了在請求處理流程中插入邏輯的能力,適合實現與業務緊密相關的橫切關注點(如鑒權、日志)。合理使用攔截器可以顯著提升代碼的可維護性和復用性。
二 多個攔截器的執行順序
個人理解總結
1 所有的preHandle都放行之后才可以執行postHandle這一行
2 如果preHandle0和preHandle1執行并返回true那么后面會依次執行preHandle2
(如果preHandle的返回值為false那么會執行afterCompletion1,afterCompletion0這兩個方法)
(如果preHandle的返回值為true那么會執行postHandle2,1,0,并依次afterCompletion,2,1,0)
3 afterCompletion與postHandle兩條鏈路互不影響,這兩條鏈路的影響因素是preHandle這一行,如果這兩條鏈路中在某一個環節斷了(拋出異常),那么這一條鏈路將會停止,而另一條鏈路不受影響。
(如果pre這一層正常執行,而postHandle1拋出異常,那么后續的postHandle0將不再執行,而afterCompletion這一條鏈路不受影響正常執行。)
(如果pre這一層正常執行,而afterCompletion1拋出異常,那么后續的afterCompletion0將不再執行,而postHandle這一條鏈路不受影響并且已經執行完成。)
三 攔截器與過濾器的區別
在Spring框架中優先使用攔截器,在web框架可以選擇filter過濾器