首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring MVC 攔截器 preHandle 中 handler 判斷邏輯解析

     編輯:程式設計綜合問答

代碼片段

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 請求,直接放行避免不必要的處理或誤判。

完整 preHandle 典型模板

@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 表示攔截,需自行處理響應(寫入錯誤碼、跳轉登錄頁等),否則客戶端收到空白響應。
  • Spring 5.3+ 可使用 HandlerMethod.class.isInstance(handler) 替代 instanceof。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved