2012-03-04 48 views
38

cross-origin'Authorization'-header我試圖發送一個跨域的域並添加一個自定義的'授權'標題。 請參閱下面的代碼。jquery.ajax()

錯誤:

的XMLHttpRequest不能加載{URL}。請求標頭字段Access-Control-Allow-Headers不允許授權。

function loadJson(from, to) { 
    $.ajax({ 
     //this is a 'cross-origin' domain 
     url : "http://localhost:2180/api/index.php", 
     dataType : 'json', 
     data : { handler : "statistic", from : from, to : to 
     }, 
     beforeSend : setHeader, 
     success : function(data) { 
      alert("success"); 
     }, 
     error : function(jqXHR, textStatus, errorThrown) { 
      alert("error"); 
     } 
    }); 
} 

function getToken() { 
    var cookie = Cookie.getCookie(cookieName); 
    var auth = jQuery.parseJSON(cookie); 
    var token = "Token " + auth.id + ":" + auth.key; 
} 

function setHeader(xhr) { 
    xhr.setRequestHeader('Authorization', getToken()); 
} 

我也試過:

headers : { 'Authorization' : getToken() }, 
在Ajax請求

難道是jQuery的ajax框架阻止交叉來源認證?我怎樣才能解決這個問題?

更新:

順便說一句:有沒有那麼存儲在客戶端的auth.key在cookie中更安全的方法? getToken()將被更復雜的方法取代,散列正文,日期等。

+1

你的'getToken()'方法不會返回任何東西。 – istepaniuk 2013-04-29 11:58:50

回答

61

這是製作CORS請求的示例。如果您有權訪問服務器(我假設您這樣做是因爲這是對localhost的請求),您將需要添加CORS特定的響應標頭。最簡單的方法是添加以下響應標頭:

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE 
Access-Control-Allow-Headers: Authorization 

您的服務器還需要配置爲響應HTTP OPTIONS請求。你可以在這裏瞭解更多有關製作CORS請求的信息:http://www.html5rocks.com/en/tutorials/cors/

+3

好吧..我忘了這三個標題的最後一個。我只是發送Origin和Methods。愚蠢的錯誤。 :) 是的,我實現了選項。良好的聯繫!謝謝 – 2012-03-05 18:57:54

+0

根據MDN,在使用憑證請求而不是通配符時,需要將Access-Control-Allow-Origin頭設置爲原點。 – radicalmatt 2015-06-30 15:03:50

+0

@radicalmatt,是的,他也寫在那裏http://stackoverflow.com/a/15254158/632951:*「值'*'不能用於Access-Control-Allow-Origin標題,當Access-Control-允許證書是真實的「* – Pacerier 2016-01-26 19:47:10