spring中Interceptor的使用小結
一、Interceptor 的核心概念
Interceptor(攔截器) 是 Spring MVC 提供的一種機制,用于在請求處理的不同階段插入自定義邏輯。其核心作用包括:
- 預處理:在控制器方法執(zhí)行前進行權限校驗、日志記錄等。
- 后處理:在控制器方法執(zhí)行后修改響應數(shù)據(jù)或記錄結果。
- 資源清理:在整個請求完成后釋放資源或處理異常。
與 Filter 的區(qū)別:
| 特性 | Interceptor(攔截器) | Filter(過濾器) |
|---|---|---|
| 作用范圍 | 針對 Spring MVC 的控制器層 | 作用于 Servlet 容器層面 |
| 依賴框架 | Spring MVC 管理 | Servlet 原生規(guī)范 |
| 數(shù)據(jù)訪問 | 可操作 ModelAndView | 僅能操作 HttpServletRequest/Response。 |
二、Interceptor 的創(chuàng)建與配置
- 實現(xiàn)攔截器類
繼承HandlerInterceptor接口,重寫以下方法:
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 請求前處理(如權限校驗)
return true; // 返回 false 中斷請求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
// 控制器執(zhí)行后、視圖渲染前處理(如修改 Model 數(shù)據(jù))
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 請求完成后處理(如資源清理)
}
}
- 注冊攔截器
通過WebMvcConfigurer的addInterceptors方法配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/api/**") // 攔截路徑
.excludePathPatterns("/login"); // 排除路徑
}
}
- 路徑匹配規(guī)則:支持 Ant 風格(如
/user/*匹配單層路徑,/admin/**匹配多級路徑)。 - 多攔截器順序:通過
Order注解或實現(xiàn)Ordered接口控制優(yōu)先級,值越小優(yōu)先級越高。
三、攔截器的執(zhí)行順序
假設注冊了 Interceptor1 和 Interceptor2:
- preHandle 方法:按注冊順序執(zhí)行(Interceptor1 → Interceptor2)。
- postHandle 方法:按注冊逆序執(zhí)行(Interceptor2 → Interceptor1)。
- afterCompletion 方法:按注冊逆序執(zhí)行(Interceptor2 → Interceptor1)。
中斷場景:若某一攔截器的 preHandle 返回 false,后續(xù)攔截器和控制器均不執(zhí)行,但已通過 preHandle 的攔截器的 afterCompletion 仍會執(zhí)行。
四、典型應用場景
權限校驗
在preHandle中檢查用戶登錄狀態(tài)或角色權限,拒絕非法請求。if (request.getSession().getAttribute("user") == null) { response.sendRedirect("/login"); return false; }日志記錄
記錄請求路徑、參數(shù)、耗時等信息:long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); // 在 afterCompletion 中計算耗時性能監(jiān)控
統(tǒng)計接口響應時間,優(yōu)化慢請求。數(shù)據(jù)預處理
在postHandle中統(tǒng)一添加響應頭或加密敏感數(shù)據(jù)。
五、注意事項與最佳實踐
性能優(yōu)化
- 避免在攔截器中執(zhí)行耗時操作(如遠程調(diào)用)。
- 合理設置攔截路徑,減少不必要的攔截。
常見問題排查
- 攔截器未生效:檢查路徑匹配規(guī)則、是否注冊到 Spring 容器。
- 順序混亂:通過
@Order明確優(yōu)先級。
與 AOP 結合
- 攔截器適用于請求生命周期中的橫切邏輯,而 AOP 更適用于方法級別的切面(如事務管理)。
六、完整示例
- 日志攔截器
public class LogInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("請求開始: " + request.getRequestURI());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("請求完成: " + request.getRequestURI());
}
}
- 配置類
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**");
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/admin/**")
.order(1); // 高優(yōu)先級
}
}
總結
Spring Interceptor 是處理請求生命周期橫切邏輯的利器,通過靈活配置路徑和優(yōu)先級,可實現(xiàn)權限控制、日志記錄等通用功能。結合 preHandle、postHandle 和 afterCompletion 的分階段處理,能有效提升代碼復用性和可維護性。
到此這篇關于spring中Interceptor的使用小結的文章就介紹到這了,更多相關spring Interceptor使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 深入解析Spring MVC中攔截器Interceptor的實現(xiàn)原理和應用場景
- Spring?Boot?Interceptor的原理、配置、順序控制及與Filter的關鍵區(qū)別對比分析
- SpringBoot使用Mybatis-Plus中分頁插件PaginationInterceptor詳解
- Spring Boot攔截器Interceptor與過濾器Filter深度解析(區(qū)別、實現(xiàn)與實戰(zhàn)指南)
- Spring Mvc中攔截器Interceptor用法解讀
- Spring Boot攔截器Interceptor與過濾器Filter詳細教程(示例詳解)
- Spring攔截器之HandlerInterceptor使用方式
- Spring的攔截器HandlerInterceptor詳解
- SpringMVC的處理器攔截器HandlerInterceptor詳解
相關文章
SpringBoot application.yml和bootstrap.yml的區(qū)別
本文主要介紹了SpringBoot application.yml和bootstrap.yml的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04
java后端把數(shù)據(jù)轉換為樹,map遞歸生成json樹,返回給前端(后臺轉換)
這篇文章主要介紹了java后端把數(shù)據(jù)轉換為樹,map遞歸生成json樹,返回給前端實例(后臺轉換),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-01-01
Java之注解@Data和@ToString(callSuper=true)解讀
在使用Lombok庫的@Data注解時,若子類未通過@ToString(callSuper=true)注明包含父類屬性,toString()方法只打印子類屬性,解決方法:1. 子類重寫toString方法;2. 子類使用@Data和@ToString(callSuper=true),父類也應使用@Data2024-11-11
SpringBoot?@DS注解實現(xiàn)多數(shù)據(jù)源配置以及問題解決辦法
這篇文章主要給大家介紹了關于SpringBoot?@DS注解實現(xiàn)多數(shù)據(jù)源配置以及問題解決辦法,所謂多數(shù)據(jù)源就是一個Java EE項目中采用了不同數(shù)據(jù)庫實例中的多個庫,或者是同一個數(shù)據(jù)庫實例中的多個不同庫,需要的朋友可以參考下2023-11-11

