jQuery getJSON不发送cookie

Blu*_*ero 10 javascript cookies ajax jquery cross-domain

我在domain1表单domain2上包含JS

<script type="text/javascript" src="http://www.domain2.com/script.js"></script>
Run Code Online (Sandbox Code Playgroud)

该脚本没有onload和on按钮单击对domain2的JSONP请求

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

然后在domain1上显示数据.

所以这是我的问题:getJSON请求不会将cookie发送到domain2.最奇怪的是它确实发送了半天饼干而另一半没发送.:-)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Mar*_*uan 31

如果要在不同的域/子域上使用AJAX请求,则必须实现跨源请求.

参考文献:

例子:

您的服务器需要发送此标头:

  • Access-Control-Allow-Origin:test1.floowie.com
  • Access-Control-Allow-Credentials:true //允许cookie /会话凭据
  • 访问控制允许方法:GET,POST,PUT,DELETE,OPTIONS

您可以全局返回Access-Control-Allow-Origin,也可以根据您的输入Origin($ _SERVER ['HTTP_ORIGIN'])请求标头进行设置.还适用于Access-Control-Allow-Methods.

必须实施OPTIONS请愿书.在第一次AJAX调用之前,现代浏览器使用OPTIONS方法调用该URL以检索上述标头.

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

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

$(document).ajaxSend(function (event, xhr, settings) {
    settings.xhrFields = {
        withCredentials: true
    };
});
Run Code Online (Sandbox Code Playgroud)

或具体:

$.ajax({
    url: a_cross_domain_url,
    xhrFields: {
        withCredentials: true
    }
});
Run Code Online (Sandbox Code Playgroud)

这个问题让我失去了很多时间......希望它有所帮助.

请注意,如果需要,您无需将Cookie域设置为".floowie.com".


小智 -1

你们有不同的主机。在第一个示例中,主机是“Host: www.flowie.com”。第二个是“主机:test1.flowie.com”。

我猜测 cookie 最初是由“test1.floowie.com”设置的,并且您没有指定它们应该可用于“.floowie.com”(即整个域和所有子域)。

您能首先发布设置 cookie 的代码吗?

如果你解决了这个问题,它至少应该表现出一致的行为。然而,IE 可能仍然不会跨子域传递 cookie。这就是我目前正在努力解决的问题,这就是我如何回答你的问题。