public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) {
return true; // 直接放行
}
// 後續處理:權限校驗、日誌、參數解析等
...
}
Spring MVC 的 `HandlerMapping` 返回的 `handler` 不僅僅是控制器方法,還包括:
if (!(handler instanceof HandlerMethod)) {
return true; // 非控制器方法請求(靜態資源、Servlet 轉發等)直接放行,不攔截
}
// 只有 HandlerMethod 才執行後續業務攔截邏輯(權限、日誌、參數綁定等)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 1. 非 HandlerMethod 直接放行
if (!(handler instanceof HandlerMethod)) return true;
HandlerMethod hm = (HandlerMethod) handler;
// 2. 方法級註解跳過攔截(如 @NoAuth、@NoLog)
if (hm.hasMethodAnnotation(NoAuth.class)) return true;
// 3. 類級註解跳過
if (hm.getBeanType().isAnnotationPresent(NoAuth.class)) return true;
// 4. 核心業務邏輯:Token 校驗、簽名驗證、限流等
return checkPermission(request, hm);
}
handler instanceof HandlerMethod是 Spring MVC 攔截器的**標準守衛條款**,精準劃定攔截邊界:只攔截「帶有業務語義的控制器方法請求」,放行框架內部與靜態資源請求,兼顧性能與架構純淨度。