如何在 JavaScript 中使用 XMLHttpRequest 设置 Cookie(标头)?

Posted

技术标签:

【中文标题】如何在 JavaScript 中使用 XMLHttpRequest 设置 Cookie(标头)?【英文标题】:How do I SET a Cookie (header) with XMLHttpRequest in JavaScript? 【发布时间】: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;
  
);

【问题讨论】:

fetch.spec.whatwg.org/#forbidden-header-name 【参考方案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

以上是关于如何在 JavaScript 中使用 XMLHttpRequest 设置 Cookie(标头)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GWT 中使用 XMLHttpRequest?

Ajax 完整教程

一只野生的AJAX

JS原生AJAX

手把手教你手撕ajax

手把手教你手撕ajax