2013-01-22 133 views
44

似乎已經在stackoverflow上討論過類似的東西,但我找不到完全相同的東西。跨域POST請求不發送cookie Ajax jquery

我想發送與CORS(跨源資源共享)Cookie,但它不工作。

這是我的代碼。

$.ajax(
    { 
     type: "POST", 
     url: "http://example.com/api/getlist.json", 
     dataType: 'json', 
     xhrFields: { 
      withCredentials: true 
     }, 
     crossDomain: true, 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader("Cookie", "session=xxxyyyzzz"); 
     }, 
     success: function(){ 
      alert('success'); 
     }, 
     error: function (xhr) { 
      alert(xhr.responseText); 
     } 
    } 
); 

我在請求標題中看不到這個cookie。

+0

http://stackoverflow.com/questions/3342140/cross-domain-cookies –

回答

51

您無法通過JavaScript在CORS請求上設置或讀取cookie。儘管CORS允許跨域請求,但cookie仍受到瀏覽器的同源策略的約束,這意味着只有來自同一個源的頁面才能讀取/寫入cookie。 withCredentials僅意味着由遠程主機設置的任何Cookie都會發送到該遠程主機。您將不得不通過使用Set-Cookie標頭從遠程服務器設置Cookie。

+0

這真的很奇怪。爲什麼我無法在標題中傳遞Cookie? –

+2

儘管CORS允許跨源請求,但Cookie仍受到瀏覽器的同源策略的約束,這意味着只有來自同一個源的頁面才能讀取/寫入cookie。 – monsur

+0

謝謝大家。似乎沒有在這裏討論。 –

18

請注意,這不能解決cookie共享過程,因爲通常這是不好的做法。

您需要使用JSONP爲你的類型:

從$就文檔: 跨域請求和數據類型:「JSONP」請求不支持同步操作。

$.ajax(
    { 
     type: "POST", 
     url: "http://example.com/api/getlist.json", 
     dataType: 'jsonp', 
     xhrFields: { 
      withCredentials: true 
     }, 
     crossDomain: true, 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader("Cookie", "session=xxxyyyzzz"); 
     }, 
     success: function(){ 
      alert('success'); 
     }, 
     error: function (xhr) { 
      alert(xhr.responseText); 
     } 
    } 
); 
+2

感謝@Justin舒曼 其實我確實需要作出CORS請求,沒有JSONP。 CORS是否支持cookie傳遞? –

+0

嗨,實際上使用dataType:「文本」,爲我工作就像一個魅力!謝謝! –

+1

什麼是壞習慣?在CORS請求中使用Cookie?如果是這樣,爲什麼它是不好的做法? – Mnebuerquo

5

我有這個相同的問題。會話ID由cookie發送,但由於請求是跨域的,因此瀏覽器的安全設置將阻止發送cookie。

解決方案:在客戶端(在瀏覽器中)生成會話ID,使用Javascript sessionStorage存儲會話ID,然後將每個請求的會話ID發送到服務器。

我在這個問題上掙扎了很多,而且周圍沒有太多好的答案。這裏有一個文章,詳細的解決方案:Javascript Cross-Domain Request With Session