(注意:这是我的问题Can jQuery.getJSON put a domain's cookies in the header it make?并涵盖在 AJAX 请求中设置 cookie 的 XSS 案例?)
有人告诉我,我无法使用$.cookie(..., ..., {domain: ...})
. 但是在对我最后一个问题的回复中,@zanlok 说“但是,服务器的回复肯定可以设置一个 cookie”,并且得到了两个支持。
所以我想我会尝试使用一种服务,该服务是为设置 cookie 的明确目的而创建的,称为Freebase 的“触摸”API。调用看起来像:
$.getJSON("http://api.sandbox-freebase.com/api/service/touch",
{}, // URL parameters
afterCookieIsSetCallback); // Callback function
在 FireBug 中查看响应标头是这样的:
Date Wed, 24 Nov 2010 03:35:28 GMT
Server Apache
X-Metaweb-Cost [...]
Etag [...]
Expires Wed, 24 Nov 2010 03:35:29 GMT
Cache-Control no-store
Vary Accept-Encoding
Content-Encoding gzip
Set-Cookie mwLastWriteTime=1290569730|10325_9202a8c04000641f80000000199eff96|sandbox; expires=Thu, 25-Nov-2010 03:35:28 GMT; Path=/
Last-Modified Wed, 24 Nov 2010 03:35:28 GMT
Content-Length 134
Content-Type text/plain; charset=utf-8
X-Cache MISS from cache01.sandbox.sjc1.metaweb.com
Connection keep-alive
X-Metaweb-TID cache;cache01.sandbox.sjc1:8101;2010-11-24T03:35:28Z;0001
所以那里肯定有一个 Set-Cookie,脚本运行响应处理程序。然而,该脚本发出的后续 JSON 请求的请求标头中不存在 cookie .sandbox-freebase.com
。
(相比之下,只需在地址栏中输入 touch api URL 并以这种方式加载它确实会为将来的请求设置 cookie。即使在其他选项卡中也适用。)
这似乎与之前的“预期行为”有所偏差,因为 MetaWeb 大约在“2007-2009”发布了一个工具包,似乎认为这种方法可以工作:
在不太了解它的情况下,我想知道这是否是 Firefox 采用的最近更改,然后 WebKit 也效仿了。也许这里提到的那个:
http://trac.webkit.org/browser/trunk/WebCore/xml/XMLHttpRequest.cpp#L856
那么有没有关于这个特定问题的规范文档?