为什么jQuery';s.ajax()方法不发送我的会话cookie?
在通过为什么jQuery';s.ajax()方法不发送我的会话cookie?,jquery,ajax,session,cookies,Jquery,Ajax,Session,Cookies,在通过$.ajax()登录到某个站点后,我试图向该站点发送第二个$.ajax()请求-但是当我检查使用FireBug发送的标题时,请求中没有包含会话cookie 我做错了什么?如果您正在调用的url与您的调用脚本位于同一个域中,AJAX调用只会发送cookie 这可能是一个跨域问题 可能您试图在调用脚本位于www.domain-b.com时从www.domain-a.com调用url(换句话说:您进行了跨域调用,在这种情况下,浏览器不会发送任何cookie来保护您的隐私) 在这种情况下,您可以选
$.ajax()
登录到某个站点后,我试图向该站点发送第二个$.ajax()
请求-但是当我检查使用FireBug发送的标题时,请求中没有包含会话cookie
我做错了什么?如果您正在调用的url与您的调用脚本位于同一个域中,AJAX调用只会发送cookie 这可能是一个跨域问题 可能您试图在调用脚本位于
www.domain-b.com
时从www.domain-a.com
调用url(换句话说:您进行了跨域调用,在这种情况下,浏览器不会发送任何cookie来保护您的隐私)
在这种情况下,您可以选择:
- 编写一个驻留在域b上的小型代理,并将您的请求转发到域a。您的浏览器将允许您调用代理,因为它与调用脚本位于同一服务器上。
然后您可以配置此代理,以接受cookie名称和值参数,并将其发送到域a。但要使其正常工作,您需要知道cookie的名称和您在域上的服务器的值—a需要进行身份验证 - 如果要获取JSON对象,请尝试使用请求。jQuery支持这些。但您需要更改域a上的服务,以便它返回有效的JSONP响应
如果这有一点帮助的话,我很高兴。我在跨域场景中操作。登录期间,远程服务器将Set Cookie头和
Access Control Allow Credentials
一起返回到true
对远程服务器的下一个ajax调用应该使用此cookie
CORS的访问控制允许凭据
允许跨域日志记录。检查示例
对我来说,这似乎是JQuery中的一个bug(或者至少是下一个版本中的特性)
更新:
jquery.ajax()
设置XMLHttpRequest.withCredentials=“true”
参数xhrFields
param
文档中的示例为:
$.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]
否则,负载将不会返回到脚本。请参阅:我也遇到了同样的问题,在做一些检查时,我的脚本只是没有得到sessionid cookie 通过查看浏览器中的sessionid cookie值,我发现我的框架(Django)正在以HttpOnly作为默认值传递sessionid cookie。这意味着脚本无法访问sessionid值,因此无法将其与请求一起传递。当这么多东西使用Ajax时,HttpOnly将成为默认值,这需要访问限制,这有点荒谬 为了解决这个问题,我更改了一个设置(SESSION_COOKIE_HTTPONLY=False),但在其他情况下,它可能是COOKIE路径上的“HTTPONLY”标志
xhrFields: { withCredentials:true }
作为jQuery的一部分,ajax调用只是解决方案的一部分。我还需要在我的资源的选项响应中返回标题:
Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true
重要的是,期权看涨期权的响应标题中只有一个允许的“来源”,而不是“*”。我通过从请求中读取源代码并将其填充回响应中实现了这一点——可能绕过了限制的原始原因,但在我的用例中,安全性并不是最重要的
我认为有必要明确提到只对一个源代码的要求,因为W3C标准允许使用空格分隔的列表,但Chrome不允许!
注意“在实践中”这一点。对于这个问题已经有很多很好的回答,但是我认为澄清一下这样一种情况可能会有所帮助,即您希望发送会话cookie,因为cookie域匹配,但它没有被发送,因为AJAX请求正在发送到不同的子域。在本例中,我有一个分配给*.mydomain.com域的cookie,我希望它包含在对different.mydomain.com的AJAX请求中“。默认情况下,不会发送cookie。您不需要在会话cookie上禁用HTTPONLY来解决此问题。您只需要执行wombling建议的()并执行以下操作 1) 将以下内容添加到ajax请求中
xhrFields: { withCredentials:true }
2) 将以下内容添加到不同子域中资源的响应标题中
Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true
也许不是100%回答这个问题,但我无意中发现了这个线程,希望在ajax发布innovastudio编辑器assetmanager的文件上传时解决会话问题。 最终解决方案很简单:他们有一个flash上传器。禁用该(设置)
var flashUpload = false;
在asset.php中),灯光再次开始闪烁
由于这些问题可能很难调试,我发现在上载处理程序中添加以下内容将使您(在本例中是我)走上正确的轨道:
$sn=session_name();
error_log("session_name: $sn ");
if(isset($_GET[$sn])) error_log("session as GET param");
if(isset($_POST[$sn])) error_log("session as POST param");
if(isset($_COOKIE[$sn])) error_log("session as Cookie");
if(isset($PHPSESSID)) error_log("session as Global");
深入日志,我很快发现了丢失的会话,其中没有发送cookie。将其放入init函数:
$.ajaxSetup({
xhrFields: {
withCredentials: true
}
});
它将起作用。如果您在
localhost
或localhost上的端口(如localhost:8080
)上进行开发,除了上述答案中描述的步骤外,您还需要确保
$.ajax(fullUrl, {
type: "GET",
contentType: "text/plain",
xhrFields: {
withCredentials: true
},
crossDomain: true
});
$.cookie("mycookie","mayvalue",{**path:'/'**});