javascript - jQuery getJSON 不发送 cookie

标签 javascript jquery ajax cookies cross-domain

我在 domain1 表单 domain2 上包含 JS

<script type="text/javascript" src="http://www.domain2.com/script.js"></script>

该脚本不会加载并在按钮上单击对域 2 的 JSONP 请求

$.getJSON( 'http://www.domain2.com/process?callback=?',
    function(data){
        if ( data ) processData( data );
    }
);

然后显示域1上的数据。

所以这是我的问题: getJSON 请求不会将 cookie 发送到 domain2。 最奇怪的是,它确实会在半天时间发送 cookie,而另一半天则不发送。 :-)

这是请求不起作用时的样子:

Request details
GET /ajax/embed-user-library?detail=98&callback=jsonp1312398534998 HTTP/1.1 
User-Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
Host: www.floowie.com
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: en,sk-SK;q=0.9,sk;q=0.8
Accept-Encoding: gzip, deflate
Referer: http://www.sokker.cz/en/test2
Connection: Keep-Alive

Response details
HTTP/1.1 200 OK 
Date: Wed, 03 Aug 2011 19:06:51 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.5-0.dotdeb.1
Set-Cookie: SESSID=64292b70dc28d7c6c9f13f70070353d8; path=/; domain=.floowie.com
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Content-Length: 34
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: application/json

当它起作用时(脚本中没有任何改变):

Request details
GET /ajax/embed-user-library?detail=99&test=1&callback=jsonp1312398534999 HTTP/1.1 
User-Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
Host: test1.floowie.com
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: en,sk-SK;q=0.9,sk;q=0.8
Accept-Encoding: gzip, deflate
Referer: http://www.sokker.cz/en/test2
Cookie: __utma=254918925.1489796832.1301725317.1312260335.1312298033.44; __utmz=254918925.1312298033.44.11.utmcsr=sokker.cz|utmccn=(referral)|utmcmd=referral|utmcct=/en/test2; lang=en; FLWSESSID=ddd1bc696f83f5a70b5f0f3ae30b4691; __utma=121955676.1030804516.1282595153.1312390656.1312397285.194; __utmb=121955676.8.10.1312397285; __utmc=121955676; __utmz=121955676.1312397285.194.21.utmcsr=floowie.crmserver.cz|utmccn=(referral)|utmcmd=referral|utmcct=/index.php
Connection: Keep-Alive

Response details
HTTP/1.1 200 OK 
Date: Wed, 03 Aug 2011 19:07:45 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.5-0.dotdeb.1
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Content-Length: 20
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: application/json

有人看到过这样的行为吗? 可以解决吗?

谢谢

最佳答案

如果您想在不同域/子域上使用 AJAX 请求,您必须实现跨源请求。

引用资料:

例子:

您的服务器需要发送此 header :

  • 访问控制允许来源:test1.floowie.com
  • Access-Control-Allow-Credentials: true//允许 cookie/session 凭证
  • Access-Control-Allow-Methods:GET、POST、PUT、DELETE、OPTIONS

您可以全局返回 Access-Control-Allow-Origin 或根据您输入的 Origin ($_SERVER['HTTP_ORIGIN']) 请求 header 进行具体设置。同时申请 Access-Control-Allow-Methods

必须执行OPTIONS请愿书。在第一次 AJAX 调用之前,现代浏览器使用 OPTIONS 方法调用该 URL 以检索上述 header 。

好的,这是第一部分,第二部分是 jQuery。仔细阅读此页面:http://api.jquery.com/jQuery.ajax/

您需要为每个 AJAX 调用添加一些选项,您可以在全局范围内进行:

$(document).ajaxSend(function (event, xhr, settings) {
    settings.xhrFields = {
        withCredentials: true
    };
});

或具体:

$.ajax({
    url: a_cross_domain_url,
    xhrFields: {
        withCredentials: true
    }
});

这个问题让我损失了许多小时……希望对您有所帮助。

请注意,如果需要,您不需要将 cookie 域设置为“.floowie.com”。

关于javascript - jQuery getJSON 不发送 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6930650/

相关文章:

javascript - 分离、排序的 d3 圆圈沿 X 轴显示

javascript - 如何制作滚动星空

javascript - 在raphael js中访问集合内的集合

javascript - 动态更改 div 的边框半径

javascript - 向切换为显示文本的标题添加向上或向下箭头

javascript - 使用 Ajax POST 请求将图像和 JSON 数据发送到服务器?

javascript - 屏幕插件在错误的时间加载类名

javascript - 如何在不破坏框架的情况下将 jQuery 添加到框架中

javascript - ValidateAntiForgeryToken 由于 AJAX 调用而失败

javascript - 如何使用 onclick 事件在同一窗口和选项卡中打开链接?