为什么jQuery的.ajax()方法没有发送我的会话cookie?
为什么jQuery的.ajax()方法没有发送我的会话cookie?
通过$.ajax()
登录某个网站后,我正在尝试向该网站发送第二个$.ajax()
请求 - 但是当我使用FireBug检查发送的头信息时,请求中没有包括会话cookie。
我做错了什么?
只有当你调用的URL和你的调用脚本位于同一域名下时,AJAX调用才会发送Cookies。
这可能是跨域问题。
也许你试图从www.domain-a.com
调用一个URL,而你的调用脚本在www.domain-b.com
上(换句话说:你进行了一个跨域调用,在这种情况下,浏览器不会发送任何Cookies以保护你的隐私)。
在这种情况下,你有以下选项:
- 编写一个小代理,驻留在domain-b上,并将你的请求转发到domain-a。你的浏览器将允许你调用代理,因为它与调用脚本在同一服务器上。
然后,你可以配置这个代理来接受一个cookie名称和值参数,它可以发送到domain-a。但是,要使这个工作正常,你需要知道domain-a上的服务器想要用于身份验证的cookie名称和值。 - 如果你正在获取JSON对象,请尝试使用JSONP请求。jQuery支持这些请求。但是,你需要修改domain-a上的服务,使其返回有效的JSONP响应。
如果这些对你有帮助,我会很高兴的。
我正在跨域场景中操作。在登录过程中,远程服务器返回了一个设置了Access-Control-Allow-Credentials
为 true 的 Set-Cookie 的头信息。
下一次向远程服务器发送的 ajax 调用应该使用这个 cookie。
CORS 的 Access-Control-Allow-Credentials
是为了允许跨域登录。请参考 https://developer.mozilla.org/En/HTTP_access_control 获取示例。
对我来说,这似乎是 JQuery 的一个 bug(或至少是下一个版本将要添加的功能)。
更新:
-
自动从 AJAX 响应中设置 cookie(引用:http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/)不起作用。
为什么?
-
你无法从响应中获取 cookie 的值并手动设置它(http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-getresponseheader)。
我感到困惑了...
应该有一种方法可以要求
jquery.ajax()
设置XMLHttpRequest.withCredentials = "true"
参数。
答案:
你应该使用 xhrFields
参数和http://api.jquery.com/jQuery.ajax/
文档中的示例是:
$.ajax({ url: a_cross_domain_url, xhrFields: { withCredentials: true } });
同样重要的是,服务器必须正确地响应这个请求。这里把 @Frédéric 和 @Pebbl 的非常好的评论复制在这里:
重要提示:在响应认证请求时,服务器必须指定一个域名,不能使用通配符。如果响应头被通配为:Access-Control-Allow-Origin: *
,上面的示例将失败。
所以请求是:
Origin: http://foo.example Cookie: pageAccess=2
服务器应该响应:
Access-Control-Allow-Origin: http://foo.example Access-Control-Allow-Credentials: true [payload]
否则,负载数据将不会返回到脚本。参见:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials。