为什么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(或者至少是下一个版本中的特性)

更新:

  • 不会从AJAX响应自动设置Cookie(引用:)

    为什么?

  • 您无法从响应中获取cookie的值以手动设置它()

    我很困惑

    应该有一种方法可以要求
    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:'/'**});