在跨域ajax请求之后保留cookie

10.0.0.1运行的javascript应用程序尝试使用跨域ajax调用对其用户进行身份validation。

请求如下:

 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。

这可能吗?

我在Chrome和Firefox 9中测试过。

服务器应该设置标头:

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

客户端设置为:

 xhrFields: { withCredentials: true } 

只要您使用支持CORS的浏览器,AJAX请求上的cookie就可以运行。 但是您必须在XMLHttpRequest上设置withCredentials为true。

请参阅: withCredentials属性

我不使用JQuery,但这里有一个专门withCredentials通过JQuery设置withCredentials的问题。

使用跨域post发送凭据?

不,cookie不能跨域共享。 假设浏览器支持它们,使用Access-Control-*标头可以绕过AJAX调用相同的原始策略 ,但对于cookie,没有办法。

+ Darin Dimitrov怀疑“浏览器没有保存cookie,因为它来自另一个域而不是托管该呼叫源的页面的域”。

但是,在使用JSONP时,cookie会根据需要进行设置,但JSONP仅用于GET请求。

我的解决方案是通过在加载以下php文件来检索cookie(PHP会话ID):

  

并在所有跨域POST请求中将会话ID作为请求变量传递。