在跨域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):
echo $_GET['callback'] . '("' . session_id() . '")'; ?>
并在所有跨域POST请求中将会话ID作为请求变量传递。