可以修改 jQuery ajax 请求中的 cookie 值吗?

Possible to modify cookie values in a jQuery ajax request?

我正在开发 Chrome 扩展,允许用户记录站点的所有 HTTP 请求,修改请求的片段,然后重新发送。

我希望使用 jQuery's ajax method 构建并发送修改后的请求。我已经能够构建请求的其他部分,但据我所知,没有办法在请求中包含 cookie 值。

明确一点 - 我不是要在浏览器上创建 cookie,我是要修改将作为 HTTP 请求的一部分使用 jQuery 发送的 cookie 值s ajax 方法。

可以用 jQuery 的 ajax 来完成吗?如果没有,是否可以在 javascript 中完成?

使用 jQuery.ajax().

不可能在任何地方都做到这一点

XMLHttpRequest 不允许您修改 Cookie header (see spec),并且 jQuery.ajax 在幕后使用 XMLHttpRequest

直接在javascript中使用XMLHttpRequest也有同样的问题,所以没有帮助。

可以在当前文档中添加cookies,告诉jQuery告诉XHR用xhrFields: { withCredentials: true }发送cookiescross-domain,但是目标站点也得有对应的CORS设置,这听起来与您的 use-case.

不匹配

如果你想尝试一下,一些资源:

Sending credentials with cross-domain posts?

http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings(寻找 xhrFields)

既然你在谈论 Chrome 扩展,你可以使用 webRequest API 来拦截和修改你的请求。

chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    /* Identify somehow that it's a request initiated by you */

    for (var i = 0; i < details.requestHeaders.length; i++) {
      if (details.requestHeaders[i].name === 'Cookie') {
        /* Do something with it */
        break;
      }
    }

    /* Add the Cookie header if it was not found */

    return {requestHeaders: details.requestHeaders};
  },
  {urls: ["*://*.example.com/*"]}, 
  ["blocking", "requestHeaders"]
);

通过这种方式,您应该能够在不实际修改浏览器的 cookie 存储的情况下修改 cookie。 我说"should"是因为我没有测试过这个方案

一些要点:

  • 您将需要权限:"webRequest""webRequestBlocking" 和主机权限(对于此示例,"*://*.example.com/"
  • 需要注意的是,您不能拦截自己的同步请求,以防止死锁。只要您的 AJAX 是异步的,就没有关系。
  • 如果您需要阻止 Set-Cookie 响应到达 cookie 存储,您可以通过修改 onHeadersReceived 中的响应 headers 来实现。您可以使用请求ID找到对应的响应。