2012-01-13 100 views
15

10.0.0.1上運行的JavaScript應用程序嘗試使用跨域ajax調用來驗證其用戶。在跨域ajax請求後保留cookie

請求看起來像:

function test(again){ 
    $.ajax({ 
    type: 'GET', 
    url: 'http://example.com/userinfo', 
    dataType: 'json', 
    success: function(userinfo){ 
     if(again) 
     test(false);}});} 
test(true); 

來自服務器的第一個響應試圖設置一個cookie:

Access-control-allow-origin:http://10.0.0.1 
Set-Cookie:PHPSESSID=uuj599r4k1ohp48f1poobil665; expires=Sat, 28-Jan-2012 17:10:40 GMT; path=/ 

但第二個請求不包括這個cookie,也不做任何其他的AJAX請求到該域。

我不想爲另一個域讀取cookie,我只是希望其他域上的應用程序能夠設置和讀取它自己的cookie。

這可能嗎?

我在鉻和Firefox測試9.

回答

1

否,餅乾不能共享跨域。假設瀏覽器支持它們,則可以使用Access-Control-*標頭規避same origin policy的AJAX調用,但對於Cookie則無法實現。

+1

感謝您的輸入。但是我不想跨域共享cookie。我只是想在請求到同一個域名之間共享cookie。如果這是你的意思,請澄清。 – AtnNn 2012-01-13 17:56:30

+0

@atnnn它的情況下,它應該工作,你是100%確定它不?確保您的後續請求是完全相同的域名,而不是子域名或超級域名。 – DaveRandom 2012-01-13 18:00:44

+0

如果你看看我的代碼,你會發現它是完全一樣的請求,並且沒有競爭條件。 – AtnNn 2012-01-13 18:02:08

0

+ Darin Dimitrov懷疑「cookie不是由瀏覽器保存的,因爲它來自另一個域名,而不是來自該域名的域名。

但是,在使用JSONP時,cookie會根據需要設置,但JSONP僅適用於GET請求。

我的解決辦法是在加載下面的PHP文件檢索的cookie(一個PHP會話ID),一個<script>

<? echo $_GET['callback'] . '("' . session_id() . '")'; ?> 

而且通過會話ID在所有跨域POST請求變量要求。

10

只要您使用支持CORS的瀏覽器,AJAX請求中的cookie就可以工作。但是,您必須將上的withCredentials設置爲true。

參見:The withCredentials attribute

我不使用JQuery,但這裏是與通過JQuery設置withCredentials專門處理的問題。

Sending credentials with cross-domain posts?

+1

爲了說明問題,[developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS)上的文檔陳述瞭如何使用具有憑證的請求:「在響應憑證請求,服務器必須指定一個域,並且不能使用通配。「因此,請確保您的'Access-Control-Allow-Origin'標頭包含請求來自的實際域,而不是'*'。 – 2015-05-28 14:45:34

11

服務器應設置標題:

response.Headers.Add("Access-Control-Allow-Credentials", "true"); 

客戶端設置爲:

xhrFields: { 
    withCredentials: true 
} 
+0

不應該設置響應爲'response.Headers.Add(「Access-Control-Allow-Credentials」,「true」);'? – bounav 2013-07-21 08:42:22

+0

是的,我定義了一個const字段。 – Teddy 2014-05-11 04:32:30

+0

這節省了我的一天,謝謝! – 2015-06-16 15:08:47