在通过$.ajax()登录到一个网站后,我试图向该网站发送第二个$.ajax()请求-但当我检查使用FireBug发送的报头时,请求中没有会话cookie。

我做错了什么?


当前回答

把这个放在你的init函数中:

$.ajaxSetup({
  xhrFields: {
    withCredentials: true
  }
});

它会起作用的。

其他回答

使用

xhrFields: { withCredentials:true }

作为我的jQuery ajax调用的一部分只是解决方案的一部分。我还需要有从我的资源的选项响应返回的头:

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 注意“在实践中”的部分。

加上我的设想和解决方案,说不定能帮助到别人。我在使用RESTful api时遇到过类似的情况。我的承载HTML/Script/CSS文件的Web服务器和公开api的Application server托管在同一个域中。 然而,道路是不同的。

Web服务器- mydomain/webpages/abc.html

使用abc.js将cookie设置为mycookie

应用服务器- mydomain/webapis/servicename。

对哪个API调用

我期待在我的域名/webapis/servicename的cookie,并尝试读取它,但它没有被发送。 在阅读评论从答案,我检查在浏览器的开发工具 Mycookie的路径被设置为“/webpages”,因此在服务调用中不可用

mydomain webapis / xml数据

所以当设置cookie从jquery,这是我所做的-

$.cookie("mycookie","mayvalue",{**path:'/'**});

把这个放在你的init函数中:

$.ajaxSetup({
  xhrFields: {
    withCredentials: true
  }
});

它会起作用的。

也许不能100%回答这个问题,但我无意中发现了这个帖子,希望解决一个会话问题,当ajax从innovastudio编辑器的资产管理器上传文件时。 最终解决方案很简单:他们有一个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。

我有同样的问题,做一些检查我的脚本只是没有得到sessionid cookie。

通过查看浏览器中的sessionid cookie值,我发现我的框架(Django)将sessionid cookie以HttpOnly作为默认值传递。这意味着脚本不能访问sessionid值,因此不能将它与请求一起传递。有点荒谬的是,HttpOnly将是默认值,而很多东西都使用Ajax,这将需要访问限制。

为了解决这个问题,我改变了一个设置(SESSION_COOKIE_HTTPONLY=False),但在其他情况下,它可能是cookie路径上的“HttpOnly”标志