为什么jQuery的.ajax()方法不发送我的会话cookie?

在通过$.ajax()登录到某个站点后,我试图向该站点发送第二个$.ajax()请求-但是当我检查使用FireBug发送的标题时,请求中没有包含会话cookie

我做错了什么

我在跨域场景中操作。登录期间,远程服务器将Set Cookie头和Access Control Allow Credentials一起返回到true

对远程服务器的下一个ajax调用应该使用此cookie

CORS的访问控制允许凭据允许跨域日志记录。检查https://developer.mozilla.org/En/HTTP_access_control 例如

对我来说,这似乎是JQuery中的一个bug(或者至少是下一个版本中的特性)

更新:

  1. Cookie不会从AJAX响应中自动设置(引用:http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/)

    为什么?

  2. 您无法从响应中获取cookie的值来手动设置它(http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest getresponseheader)

    我很困惑

    应该有一种方法可以要求jquery.ajax()设置XMLHttpRequest.withCredentials=“true”参数

回答:
您应该使用的xhrFieldsparamhttp://api.jquery.com/jQuery.ajax/

文档中的示例为:

$.ajax({
url:一个跨域url,
xhrFields:{
证书:正确
}
});

服务器正确响应此请求也很重要。在这里复制@Frédéric和@Pebbl的精彩评论:

重要提示:当响应认证请求时,服务器必须指定域,并且不能使用通配符。如果标题通配符为:Access Control Allow Origin::

因此,当请求是:

原点:http://foo.example
Cookie:pageAccess=2

服务器应以以下方式响应:

访问控制允许原点:http://foo.example
访问控制允许凭据:true
[有效载荷]

否则,负载将不会返回到脚本。见:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials

发表评论