【问题标题】:How to get a cookie from an AJAX response?如何从 AJAX 响应中获取 cookie?
【发布时间】:2012-10-02 04:01:39
【问题描述】:

我在同一个域上有一个$.ajax 请求,我想读取 cookie。它不断返回null

$.ajax({
    type: 'GET',
    url: myUrl,
    success: function(output, status, xhr) {
        alert(xhr.getResponseHeader("MyCookie"));
    },
    cache: false
});

有什么想法吗?我正在为此使用 Chrome。

【问题讨论】:

    标签: jquery html ajax google-chrome


    【解决方案1】:

    您正在寻找Set-Cookie 的响应标头:

    xhr.getResponseHeader('Set-Cookie');
    

    但它不适用于 HTTPOnly cookie。

    更新

    根据XMLHttpRequest Level 1XMLHttpRequest Level 2,这个特定的响应标头属于您可以使用getResponseHeader() 获得的“禁止”响应标头,所以这可以工作的唯一原因基本上是一个“顽皮”的浏览器.

    【讨论】:

    • 有没有办法指示我的浏览器将新的 cookie 附加到我的表单中?
    • 如果您发送另一个请求,这些 cookie 将被再次发送。但由于它们只是字符串,我想你可以将它们添加为隐藏字段。
    • 我的 cookie 为空。但是在浏览器控制台中,我也可以看到我执行 ajax 处理的文件的响应标头和 cookie 字符串。有任何想法吗? ://
    • 我说'拒绝获取不安全的标头“Set-Cookie”'
    • 这不是 HTTPOnly 限制。 XHR 有一个禁止标头列表,其中包括响应标头Set-Cookie。这是列表fetch.spec.whatwg.org/#forbidden-header-name
    【解决方案2】:
    xhr.getResponseHeader('Set-Cookie');
    

    它对我不起作用。

    我用这个

    function getCookie(cname) {
        var name = cname + "=";
        var ca = document.cookie.split(';');
        for(var i=0; i<ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') c = c.substring(1);
            if (c.indexOf(name) != -1) return c.substring(name.length,c.length);
        }
        return "";
    } 
    
    success: function(output, status, xhr) {
        alert(getCookie("MyCookie"));
    },
    

    http://www.w3schools.com/js/js_cookies.asp

    【讨论】:

    • 我想知道谁曾想过要否决这个答案。在很多情况下,标头“Set-Cookie”可能不存在; document.cookie 是安全的方法。
    • document.cookie 在文档中可用,而不是 XMLHttpRequest 响应。
    • 这不起作用:我们所说的cookie类型不能直接通过代码获得。您需要使用 xhrFields: {withCredentials: true} 请求浏览器将它们传回给您。
    【解决方案3】:

    类似于yebmouxing我不能的

     xhr.getResponseHeader('Set-Cookie');
    

    工作方法。即使我在服务器上将 HTTPOnly 设置为 false,它也只会返回 null。

    我也写了一个简单的 js 辅助函数来从文档中获取 cookie。此功能非常基本,只有在您知道要添加自己的其他信息(寿命、域、路径等)时才有效:

    function getCookie(cookieName){
      var cookieArray = document.cookie.split(';');
      for(var i=0; i<cookieArray.length; i++){
        var cookie = cookieArray[i];
        while (cookie.charAt(0)==' '){
          cookie = cookie.substring(1);
        }
        cookieHalves = cookie.split('=');
        if(cookieHalves[0]== cookieName){
          return cookieHalves[1];
        }
      }
      return "";
    }
    

    【讨论】:

      【解决方案4】:

      出于安全原因,浏览器无法访问从 ajax 请求收到的第三方 cookie,但是它会自动为您处理这些!

      为此,您需要:

      1) 使用您期望从中返回 cookie 的 ajax 请求登录:

      $.ajax("https://example.com/v2/login", {
           method: 'POST',
           data: {login_id: user, password: password},
           crossDomain: true,
           success: login_success,
           error: login_error
        });
      

      2) 在下一个 ajax 请求中连接 xhrFields: { withCredentials: true } 以使用浏览器保存的凭据

      $.ajax("https://example.com/v2/whatever", {
           method: 'GET',
           xhrFields: { withCredentials: true },
           crossDomain: true,
           success: whatever_success,
           error: whatever_error
        });
      

      浏览器会为您处理这些 cookie,即使它们无法从 headersdocument.cookie 读取

      【讨论】:

      • 我有一个单点登录服务器。我有两个 sso 客户端应用程序。在 app1 中,我登录并返回一个在我的浏览器中为 sso 服务器域设置的 cookie。现在,在对 sso 服务器的后续 ajax 请求中,两个客户端应用程序都成功地附加了这个 cookie。在 app2 中,虽然从 ajax 响应返回的 cookie 未在浏览器中设置,并且未在后续调用 sso 服务器时附加。很奇怪,能不能给点有用的提示?
      • 我在第一次 ajax 调用时没有使用这个 xhrFields: { withCredentials: true }, crossDomain: true。在第一次 ajax 调用时也需要在浏览器中成功设置 cookie。一旦我这样做了,它就成功了。
      • +10 这对于构建机器人来监控和自动化第三方供应商网站非常有用!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多