通过$.ajax()
登录到站点后,我正在尝试向该站点发送第二个$.ajax()
请求 - 但是当我检查使用FireBug发送的标头时,请求中不包含会话cookie 。
我究竟做错了什么?
#1楼
我遇到了同样的问题并做了一些检查我的脚本只是没有得到sessionid cookie。
我通过查看浏览器中的sessionid cookie值得出结论,我的框架(Django)默认使用HttpOnly传递sessionid cookie。 这意味着脚本无法访问sessionid值,因此不会将其与请求一起传递。 当很多东西使用需要访问限制的Ajax时,HttpOnly会成为默认值,这有点荒谬。
为了解决这个问题,我更改了一个设置(SESSION_COOKIE_HTTPONLY = False),但在其他情况下,它可能是cookie路径上的“HttpOnly”标志
#2楼
运用
xhrFields: { withCredentials:true }
作为我的jQuery ajax调用的一部分只是解决方案的一部分。 我还需要在我的资源的OPTIONS响应中返回标头:
Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true
重要的是,OPTIONS调用的响应头中只有一个允许的“origin”而不是 “*”。 我通过从请求中读取原点并将其填充回响应来实现这一点 - 可能绕过限制的原始原因,但在我的用例中,安全性并不是最重要的。
我认为值得明确提到只有一个来源的要求,因为W3C标准允许空格分隔列表 - 但Chrome不会! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header注意“实践中”位。
#3楼
对这个问题已经有了很多好的回答,但是我认为澄清你希望发送会话cookie的情况可能会有所帮助,因为cookie域匹配,但是由于AJAX请求是被制作到不同的子域。 在这种情况下,我有一个分配给* .mydomain.com来域中的饼干,而我希望它被包含在一个AJAX请求different.mydomain.com”。默认情况下,该cookie不会发送。您不需要在会话cookie上禁用HTTPONLY来解决此问题。您只需要执行wombling建议( https://stackoverflow.com/a/23660618/545223 )并执行以下操作。
1)将以下内容添加到您的ajax请求中。
xhrFields: { withCredentials:true }
2)将以下内容添加到响应标头中,以获取不同子域中的资源。
Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true
#4楼
也许不是100%回答这个问题,但我偶然发现了这个线程,希望在ajax-从innovastudio编辑器的assetmanager发布文件上载时解决会话问题。 最终解决方案很简单:他们有一个flash-uploader。 禁用(设置
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。
#5楼
把它放在你的init函数中:
$.ajaxSetup({
xhrFields: {
withCredentials: true
}
});
它会工作。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3194868