一、攔截器核心概念
作用:攔截器是 Spring 框架提供的核心功能,用于在請求處理前后執行預定義邏輯,實現統一處理(如登錄校驗、日志記錄等)。
核心方法:
public class LoginInterceptor implements HandlerInterceptor {// 目標方法執行前調用(核心控制點)@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {return true; // true=放行, false=攔截}// 目標方法執行后調用(Controller 方法執行完畢)@Overridepublic void postHandle(...) { ... }// 整個請求完成后的最終處理(視圖渲染后)@Overridepublic void afterCompletion(...) { ... }
}
二、攔截器使用步驟
1. 定義攔截器
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, ...) {// 登錄校驗示例HttpSession session = request.getSession(false);if (session == null || session.getAttribute("USER") == null) {response.setStatus(401); // 401 Unauthorizedreturn false; // 攔截請求}return true; // 放行}
}
2. 注冊攔截器
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**") // 攔截所有路徑.excludePathPatterns("/login") // 排除登錄接口.excludePathPatterns("/**/*.js") // 排除靜態資源.excludePathPatterns("/**/*.css");}
}
三、攔截路徑配置規則
路徑模式 | 匹配示例 | 不匹配示例 |
---|---|---|
/* | /user ,?/book | /user/login |
/** | /user ,?/user/profile | - |
/book/* | /book/add ,?/book/detail | /book/1/author |
/book/** | /book ,?/book/1/author | /user/books |
四、攔截器執行流程
五、登錄校驗實戰案例
1. 攔截器實現
public boolean preHandle(...) {if (request.getSession().getAttribute("USER") == null) {response.setStatus(401);return false;}return true;
}
2. 前端處理攔截
// AJAX 錯誤處理
$.ajax({error: function(error) {if (error.status === 401) {window.location.href = "/login.html"; // 跳轉登錄頁}}
});
六、設計模式:適配器原理
攔截器底層實現:
// DispatcherServlet 核心代碼
protected void doDispatch(...) {// 1. 獲取攔截器鏈HandlerExecutionChain mappedHandler = getHandler(request);// 2. 執行 preHandle()if (!mappedHandler.applyPreHandle(request, response)) {return; // 攔截請求}// 3. 執行 Controller 方法mv = ha.handle(...);// 4. 執行 postHandle()mappedHandler.applyPostHandle(...);// 5. 渲染視圖后執行 afterCompletion()processDispatchResult(...);
}
適配器模式應用:
-
HandlerAdapter
?適配不同類型的控制器(如?@Controller
、HttpRequestHandler
) -
解決不同處理器接口的兼容問題
七、最佳實踐建議
-
路徑排除:靜態資源(JS/CSS/圖片)必須排除
-
性能優化:在?
preHandle()
?中盡早返回攔截結果 -
異常處理:結合?
@ControllerAdvice
?統一處理攔截器拋出的異常 -
執行順序:多個攔截器按注冊順序執行?
preHandle()
,逆序執行?postHandle()
-
生產建議:
-
登錄攔截器排除?
/login
,?/health
?等公開接口 -
敏感操作(如支付)使用獨立攔截器增強校驗
-
// 多攔截器配置示例
registry.addInterceptor(new LogInterceptor()).order(1);
registry.addInterceptor(new AuthInterceptor()).order(2);
總結核心價值
-
解耦:將通用邏輯(如鑒權)從業務代碼剝離
-
復用:一次編寫,全局生效
-
可維護:統一修改攔截邏輯,避免散彈式修改
-
安全:強制實施安全策略(如所有接口必須認證)
通過攔截器 + 統一返回格式 + 統一異常處理,可構建高可維護性的 Spring Boot 后端架構,