2017-08-29 22 views
0

我正在使用過濾器來檢查授權承載令牌是否有效。儘管如此,我正在努力爭取在用戶代理(firefox,chrome ...)嘗試請求CORS OPTIONS請求之前提出「真實」請求。因此,我的過濾器截獲了這個OPTIONS請求,並且它沒有任何授權承載令牌,所以它使用4xx http代碼進行響應。應承載令牌過濾器避免OPTIONS請求?

我應該避免OPTIONS請求嗎?

private boolean isExcluded(ServletRequest request) { 
    return ((HttpServletRequest)request).getMethod().equalsIgnoreCase(HttpMethod.OPTIONS); 
} 

doFilter

if (this.isExcluded(request)) 
    chain.doFilter(request, response); 
else 
    //... 

這是正確的嗎?

回答

1

CORS處理應該在任何auth之前完成。實現它的正確方法是在之前有一個CORS過濾器任何auth過濾器。在CORS過濾器中,檢查它是否爲預檢請求。如果是,則用200響應並設置CORS響應標題。然後從過濾器返回,因此沒有進一步處理。如果它不是預檢請求,那麼只需轉到鏈中的下一個過濾器。

CORS過濾器只在響應端實現,並讓請求像平常一樣進行,這是錯誤的實現。例如,my post here是一個非常糟糕的例子。這就是爲什麼我鏈接到RESTEasy CorsFilter作爲如何實現應該的一個例子。

有關CORS預檢的更多信息,請參閱the MDN(如果您想了解它應該如何工作,請務必閱讀)。然後檢查RESTEasy CorsFilter以瞭解它是如何正確實施的。儘管它使用JAX-RS過濾器,但您可以通過使用servlet過濾器來獲得一些想法。注意的區別在於JAX-RS過濾器被分成兩個過濾器(請求和響應),而servlet過濾器在過濾器上使用,在這裏你預處理 - >處理請求 - >後處理。 JAX-RS過濾器就像前處理和後處理。

另請注意,OPTIONS請求並不總是預檢。您還應該檢查Origin標題。