在通过$.ajax()登录到某个站点后,我试图向该站点发送第二个$.ajax()请求-但是当我检查使用FireBug发送的标题时,请求中没有包含会话cookie
我做错了什么
我在跨域场景中操作。登录期间,远程服务器将Set Cookie头和Access Control Allow Credentials一起返回到true
对远程服务器的下一个ajax调用应该使用此cookie
CORS的访问控制允许凭据允许跨域日志记录。检查https://developer.mozilla.org/En/HTTP_access_control 例如
对我来说,这似乎是JQuery中的一个bug(或者至少是下一个版本中的特性)
更新:
-
Cookie不会从AJAX响应中自动设置(引用: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”参数
回答:
您应该使用的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