【问题标题】:How do I SET a Cookie (header) with XMLHttpRequest in JavaScript?如何在 JavaScript 中使用 XMLHttpRequest 设置 Cookie(标头)?
【发布时间】:2011-01-20 04:16:09
【问题描述】:

我正在尝试使用 XMLHttpRequest 在 XSS 请求中设置 Cookie。

我找到了XMLHttpRequest Specification,第 4.6.2-5 节似乎确实建议不允许设置 Cookie、Cookie2 和其他一些标头,但我希望有一个解决方法。

我的 (jQuery) 代码如下,但结果查询失败,因为未设置 cookie。

$.ajax( {
  type : "POST",
  url : URL,
  data: SOAP_INBOX_MAIL_QUERY,
  dataType : "xml",
  async: false,
  beforeSend : function(xhr) {  
    var cookie = credentials["COOKIE"];
    console.info( "adding cookie: "+ cookie );          
    xhr.setRequestHeader('Cookie', cookie);
  },
  success : function(data, textStatus, xmLHttpRequest){


  },
  error : function(xhr, ajaxOptions, thrownError) {
    credentials = null;
  }
});

【问题讨论】:

标签: javascript jquery ajax jqxhr


【解决方案1】:

https://developer.mozilla.org/En/Server-Side_Access_Control

允许您起源并将 Access-Control-Allow-Credentials HTTP 标头设置为 true

【讨论】:

    【解决方案2】:

    这是可以做到的。您在 $.ajax 调用中需要以下内容:

    xhrFields: {
        withCredentials: true
    }
    

    (请参阅 jQuery 文档),并且您还需要您提出请求以支持 CORS 的站点(它们至少需要允许您起源并将 Access-Control-Allow-Credentials HTTP 标头设置为 @ 987654323@)。

    毫无疑问,它有效。您可以通过 HTTPS、Basic Auth 等执行此操作。如果您告诉(xhrFields),jQuery 将发送所有内容(auth 标头、cookie)并且该站点提供正确的 CORS 标头。不要放弃!

    【讨论】:

    • 设置“withCredentials”将我域的所有 cookie 添加到 xhr 请求。感谢您的提示!
    • 注意服务器不能说“Access-Control-Allow-Origin: *”。 Chrome(也怀疑其他浏览器)会简单地取消 GET。
    • 拒绝投票,因为您对错误问题有正确答案,请注意,OP 似乎想在请求中设置 JavaScript 中的 cookie,大概是在浏览器中。Cf 我是尝试使用 XMLHttpRequest 在 XSS 请求中设置 Cookie。
    • 我将如何在 vanilla js 中做到这一点?
    【解决方案3】:

    如果您使用 document.cookie 设置 cookie,那么当您发送请求时,cookie 标头将包含它。

    【讨论】:

    • 我做了一组关于 cookie 的教程,其中一个只是关于使用 javascript 和 cookie。从dbp-consulting.com/tutorials/web/cookieintro.html 开始,了解一般的cookies,然后它有一个链接到一个关于从浏览器使用javascript 和从服务器通过php 访问它们的页面
    • 仅供参考,有趣的是,一些平台/环境似乎不与 XmlHttpRequests (XHR) 共享 document.cookie。因此,如果您需要在文档和 XHR 之间共享 cookie,就会出现问题,例如,通过会话 cookie 保持会话状态。对于 Safari 浏览器扩展和 Mac OS X 小部件来说,情况似乎如此。适用于 Chrome 扩展程序、Windows Vista/7 小工具等。不知道为什么 Apple 必须如此严格。可悲的是,没有人能够解决或回答我的问题,即为什么会这样或如何解决它。
    • 添加到我之前的评论中,(PHPSESSID) 会话 cookie 设置在 document.cookie 中(和/或初始 XHR 请求以获取一些数据)。后续 XHR 回发数据应该传递该会话 cookie。在 Chrome 和 Windows 小工具中,它自动运行良好(无需手动处理 cookie)。它在 Safari 和 Mac OS X 小部件中不起作用。我尝试使用 document.cookie 手动设置 cookie 请求标头,但没有成功(尽管我没有检查 document.cookie 是否具有所需的 cookie,这将是 Apple 的一个单独问题)。
    【解决方案4】:

    如果你的请求和jquery代码在同一个域,可以使用jquerycookies plugin

    【讨论】:

      【解决方案5】:

      出于安全原因,您将无法在 XMLHTTPRequest 期间修改标头。

      【讨论】:

      • 不幸的是,从我的阅读来看,情况似乎确实如此。感谢您的确认。
      • 这应该是公认的答案,因为 OP 要求在 使用 JavaScript 的请求上设置 cookie 而不是让服务器在 response 上设置 cookie
      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 2013-02-18
      • 2014-06-09
      • 1970-01-01
      • 2020-04-07
      • 2020-09-28
      • 2015-09-12
      • 1970-01-01
      相关资源
      最近更新 更多