通过 $.ajax()
登录到站点后,我试图向该站点发送第二个 $.ajax()
请求 - 但是当我检查使用 FireBug 发送的 header ,请求中没有包含 session cookie。
我做错了什么?
最佳答案
我在跨域场景中操作。在登录期间,远程服务器返回 Set-Cookie header 以及设置为 true 的 Access-Control-Allow-Credentials
。
下一次对远程服务器的 ajax 调用应该使用这个 cookie。
CORS 的 Access-Control-Allow-Credentials
允许跨域日志记录。检查https://developer.mozilla.org/En/HTTP_access_control例如。
对我来说,这似乎是 JQuery 中的一个错误(或者至少是下一个版本中的功能)。
更新:
不会根据 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"
参数。
回答:
您应该使用 http://api.jquery.com/jQuery.ajax/ 的 xhrFields
参数
文档中的例子是:
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
服务器正确回答这个请求也很重要。在这里复制@Frédéric 和@Pebbl 的精彩评论:
重要说明:在响应凭据请求时,服务器必须指定域,并且不能使用通配符。如果 header 被通配为: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
关于jquery - 为什么 jQuery 的 .ajax() 方法不发送我的 session cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2870371/