2015-01-07 88 views
1

每當我試圖與在Safari username & password選項發送$.ajax請求(同一產地),它只是默默地失敗和永遠不會觸發任何完整的,成功的,或錯誤回調。在Chrome中完全相同的請求正常工作。

req = $.ajax 
    url: ... 
    type: 'POST' 
    username: ... 
    password: ... 
    data: ... 
req.done ... 
req.fail ... 

如果我運行相同的代碼,但沒有usernamepassword;

req = $.ajax 
    url: ... 
    type: 'POST' 
    data: ... 

該請求實際上是在Safari中完成的,但顯然導致服務器的身份驗證失敗。我甚至不確定如何調試。我嘗試在$.ajax回調周圍放棄jQuery源代碼中的一些日誌行,並且它似乎(Safari)中的(嘗試)已驗證的請求永遠不會發生。

修訂1/8:

Safari /鉻還測試與jQuery 1.11.0,發現同樣的結果。

已更新1/8:

gulty的beforeSend解決方案是我能得到基本身份驗證在Safari中的唯一方法:

req = $.ajax 
    url: ... 
    type: 'POST' 
    beforeSend: (xhr) -> xhr.setRequestHeader('Authorization', 'Basic username:password') 
    data: ... 
+1

'用戶名'和'密碼'是無效的jQuery.ajax選項。它們應該構成'數據'的一部分。無論Chrome在做什麼,這可能不是你的想法。 –

+0

你確定? [文檔](http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings)表示他們進入'jQuery.ajax([settings])'。無論如何,當我將它移動到'data'時,會發生完全相同的事情。 – adamyonk

+0

請原諒,它們在HTTP訪問認證請求的上下文中有效。我的錯。 –

回答

2

您的代碼適用於大多數的瀏覽器,Safari瀏覽器反正ISN只是開發人員知道的理由才能提出要求。

有一種變通方法 - 你需要使用頭文件來設置請求頭:{}或beforeSend內,像這樣:

beforeSend: function (req) { 
    req.setRequestHeader('Authorization', "username:password"); 
} 

這是除了你的代碼 - 你還是應該保留用戶名:/密碼:對於其他瀏覽器,因爲我沒有正確測試沒有這些憑據的代碼。

+0

我見過一些人base64編碼''用戶名:密碼「'字符串;這是必要的嗎? – adamyonk

+0

取決於你的服務器期望 - 你不應該有任何人可見的js代碼內的憑據,因此你需要一些安全機制。我不會使用用戶名/密碼,如果它在同一個來源。 – gulty

+0

編碼它更安全 - 否則它被髮送平原,可以被劫持。但你必須解碼它serverside ..你也可以得到一個base64編碼的字符串tho憑據.. – gulty