2016-04-29 107 views
4

我試圖調用使用基本身份驗證一個Ajax請求基本身份驗證, 爲我添加以下代碼,使用jQuery AJAX使得兩個請求

url: appSettings.dataURL+'/app/signature', 
type: 'GET', 
crossDomain: true, 
dataType: 'html', 
context : this, 
cache : true, 
headers: {"Authorization": "Basic " + btoa('username' + ":" + 'password')} 

這將使兩個請求,一個認證和另一當我檢查網絡選項卡時無需身份驗證。爲什麼?

看到屏幕截圖,

enter image description here

是否有可能避免這種情況?

注意:這隻發生在跨域請求。

+1

這可能是因爲跨域頭未設置。看看[這個問題](http://stackoverflow.com/questions/5507234/how-to-use-basic-auth-with-jquery-and-ajax)在jQuery中的基本身份驗證已被覆蓋。 – timmyRS

+2

第一個請求是一個** preflight **請求,用於檢查服務器是否接受請求方法,並且允許該憑據,這隻會發生在** CORS **請求中。 AFAIK如果您提出跨域請求,則無法避免這種情況 – Und3rTow

回答

2

跨站請求遵循一定的安全規則。如果只自定義頁眉設置可由simple,單個請求是:

  • 接受
  • 接受語言
  • 內容語言
  • 內容類型

和內容類型是以下之一:

  • application/x- WWW窗體-urlencoded
  • 的multipart/form-data的
  • text/plain的

您發送Authorization標題,默認情況下請求HTML,所以需要一個"pre-flight request"

不像簡單請求,「預檢」請求首先通過OPTIONS方法向另一個域上的資源發送HTTP請求,以確定實際請求是否安全發送。跨站請求是這樣預檢的,因爲它們可能會影響用戶數據。

初始OPTIONS請求,而不Authorization是安全的,因爲服務器只需要與Access-Control-*頭,讓瀏覽器知道如果完全要求是確定繼續迴應。然後你的實際請求正在經歷Authorization,所以一切都按預期工作。

XMLHttpRequest對象也讓你指定你sending a request with credentials,並可能切換到只有一個要求:

xhrFields: { withCredentials: true }