2016-03-18 84 views
2

我有一些攔截器需要檢查標題和授權,以完成對我的API的某些請求。例如,某些請求應該要求用戶驗證(例如,從數據庫中更改用戶詳細信息),有些請求不需要驗證(例如,創建用戶)。不幸的是,從攔截器中排除路徑的方法不依賴於請求方法。Spring MVC攔截器在HTTP方法中排除路徑

現在我創建了一個Util類,它接收應該從驗證中排除的路徑和方法的字符串數組。例如:"POST /api/users"不應被我的身份驗證攔截器攔截,因爲它用於創建用戶,但應攔截"PUT /api/users",因爲它用於更改現有用戶(應該登錄的用戶)。

public static Boolean skipVerification(HttpServletRequest request, String... skipRequests) { 
    for (String string : skipRequests) { 
     String[] split = string.split(" "); 
     if(split[0].equals(request.getMethod()) && split[1].equals(request.getRequestURI())) 
      return true; 
    } 
    return false; 
} 

在我的攔截器的構造,我補充一點,應該被跳過的請求,並在PreHandle方法,如果該請求符合其中任何一個,因爲他們並不需要我在第一攔截我返回true地點。

public AuthenticationHeaderInterceptor(String...skipWhen) { 
    this.skipWhen = skipWhen; 
} 

@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
     throws Exception { 

    if(InterceptorUtils.skipVerification(request, skipWhen)) 
     return true; 

///Do Authentication Logic 

} 

我知道改變URI用於創建和編輯用戶將解決這個問題,但我不喜歡我的混亂與API太多的URI,並想知道是否有解決這個一個更清潔的方式。

回答

1

看着代碼,我在檢查你是否能夠擴展InterceptorRegistry,InterceptorRegistrationMappedInterceptor。您還必須擴展PathMatcher併合並代碼以檢查方法以及路徑,而這些路徑不適用於此。總的來說,你目前的做法可能是最好的。我還會指出Spring的AntPathMatcher中的代碼一直非常混亂和錯誤,所以你可能不想承擔任何涉及它的任務。