if (handler == null || !(handler instanceof HandlerMethod)) {
return true;
}
handler:HandlerMapping 解析請求得到的處理器對象,可能是 HandlerMethod(控制器方法)、ResourceHttpRequestHandler(靜態資源)、HttpRequestHandler 等。handler == null:未找到匹配的處理器(如 404 請求)。!(handler instanceof HandlerMethod):處理器不是基於註解的控制器方法(如靜態資源、WebSocket、自定義 Handler)。return true:放行,繼續執行攔截器鏈後續環節及目標處理器。典型場景:攔截器僅需對 控制器方法 進行權限檢查、日誌記錄等業務邏輯。對於靜態資源、錯誤頁面、Actuator 端點等非 HandlerMethod 請求,直接放行避免不必要的處理或誤判。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1. 非控制器方法直接放行
if (handler == null || !(handler instanceof HandlerMethod)) {
return true;
}
// 2. 獲取方法註解、參數等進行業務判斷
HandlerMethod handlerMethod = (HandlerMethod) handler;
// ... 權限檢查、Token 驗證等
// 3. 放行或攔截
return true; // 或 false 並 response.sendError/redirect
}
return false 表示攔截,需自行處理響應(寫入錯誤碼、跳轉登錄頁等),否則客戶端收到空白響應。HandlerMethod.class.isInstance(handler) 替代 instanceof。