2012-05-26 69 views
8

我配置我的碼頭服務器以允許跨域的HTTP請求(allowedOrigins = *),也允許跨域認證(allowCredentials =真)使用其CrossOriginFilter。 跨域http請求沒有認證要求工作正常。現在談到需要身份驗證的http調用時,無法使用JQuery。我用下面的代碼和接着這個例子:http://www.aswinanand.com/2009/01/http-basic-authentication-using-ajax/jQuery的跨域認證

function login(username, password) { 
$.ajax({ 
    type: "GET", 
    contentType: "application/json", 
    dataType: "json", 
    url: url, 
    beforeSend: function(xhr) { 
     var base64 = Base64.encode(username + ":" + password); 
     xhr.setRequestHeader("Authorization", "Basic " + base64); 
     xhr.withCredentials = true; 
    }, 
    error: function(data){ 
     alert("error"); 
    }, 
    success: function(data){ 
     alert("success"); 
    } 
}); 

在是HttpFox我看到下面的請求到服務器:

OPTIONS /login HTTP/1.1 
... 
Access-Control-Request-Method GET 
Access-Control-Request-Headers authorization,content-type 

服務器用

HTTP/1.1 204 No Content 
... 
Allow OPTIONS,GET,HEAD 

我還響應使用下面的選項,這沒有什麼不同。

$.ajax({ 
    ... 
    username: username, 
    password: password, 
    ... 
} 

錯誤函數總是激發。 任何人都知道問題可能是什麼?

+0

你在你的響應頭看到這個'訪問控制 - 允許原產地:*'?順便問一句好!歡迎來到StackOverflow! – jmort253

+0

我認爲如果你能顯示與這個問題相關的任何堆棧軌跡,這將會很有幫助。 – jmort253

+0

好的,請檢查您的回覆中是否包含該標題。如果不是,那麼安全性可能會覆蓋響應頭。需要查看更多日誌以進一步調試。祝你好運! :) – jmort253

回答

5

在默認允許的標題是

X-要求-着,內容類型,接受,產地

我必須通過日誌文件來添加頁眉

授權,內容類型

發現這個

DEBUG [2012-05-27 17:04 :02,468] org.eclipse.jetty.servlets.CrossOriginFilter:Headers [authorization,content-type]不在允許的標題中[X-Requested-With,Content-Type,Accept,Origin]

感謝您的所有提示!

3

您在應用程序中設置的響應頭 - 當安全未啓用00作品就好了,因爲你已經證明了這一點。但是,啓用安全性後,您的跨域請求會失敗。

這可能是由於額外的過濾器和另外的響應頭由安全過濾器,以產生一個響應集。

要解決此問題,高級別的解決方案是您必須在安全篩選器設置其響應標頭和/或將它們提交給客戶端之前設置您的響應標頭。

您還在使用Jetty;因此,您可以使用Jetty Cross Origin Filter以確保響應標頭在過濾器鏈中按照需要設置的順序進行設置:

以下是可以傳遞到Web中的過濾器配置的參數列表.XML:

  • allowedOrigins,用逗號分隔的被允許訪問的資源來源的列表。默認值是*,這意味着所有的起源

  • allowedMethods,逗號分隔的被允許訪問的資源時所使用的HTTP方法列表。默認值是GET,POST

  • allowedHeaders,被允許訪問該資源時要指定的HTTP報頭的逗號分隔的列表。缺省值爲X請求 - 帶有

  • preflightMaxAge,客戶端可以緩存預檢請求的秒數。缺省值爲1800秒,或30分鐘

  • allowCredentials,一個布爾值,指示如果資源允許與憑證請求。默認值是假

缺省情況下,允許起源響應首部設置爲*,這意味着在默認情況下,任何請求可以來自任何域製成。你需要一定要修改這個只允許您打算到白名單域,假設你不希望從所有域的每個請求是有效的:用於過濾

的web.xml條目:

<web-app ...> 
    ... 
    <filter> 
     <filter-name>cross-origin</filter-name> 
     <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>cross-origin</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    ... 
</web-app> 

這裏是額外的資源列表,你會發現在解決這方面的問題有所幫助:

0

對於SOAP的東西,在允許的標題還應該包括爲messageType,SOAPAction的

要注意的是沒有通配符允許配置允許的頭......