Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Chrome中使用JavaScript POST将自定义cookie发送到另一个域_Javascript_Jquery_Google Chrome_Cookies_Cross Domain - Fatal编程技术网

在Chrome中使用JavaScript POST将自定义cookie发送到另一个域

在Chrome中使用JavaScript POST将自定义cookie发送到另一个域,javascript,jquery,google-chrome,cookies,cross-domain,Javascript,Jquery,Google Chrome,Cookies,Cross Domain,我想将POST请求中的自定义cookie从本地主机发送到另一个域(我的域) 我通过document.cookie=“test=test”设置cookie; 我可以通过console.log(document.cookie)正确地看到它的设置,现在当我使用以下代码时,cookie不会被发送 $.ajax({ url: 'https://secure.domain.com', type: 'POST', data: "hi", ca

我想将POST请求中的自定义cookie从本地主机发送到另一个域(我的域)

我通过document.cookie=“test=test”设置cookie; 我可以通过console.log(document.cookie)正确地看到它的设置,现在当我使用以下代码时,cookie不会被发送

  $.ajax({
        url: 'https://secure.domain.com',
        type: 'POST',
        data: "hi",
        cache: false,
        contentType: false,
        processData: false,
        xhrFields: {
            withCredentials: true
        },
        crossDomain: true
    });
我甚至通过运行以下命令禁用了chrome安全性

 -args --disable-web-security --user-data-dir 
仅发送以下标题

Accept: */*
Content-Type: text/plain;charset=UTF-8
Origin: http://localhost:8888
Referer: http://localhost:8888
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.30 Safari/537.36

注意:这只供我个人使用,因此我可以禁用chrome安全性或修改任何供我使用的内容。

此行为取决于客户端-对于chrome,当与
XMLHttpRequest
一起使用时,
Cookie
头被禁止,并且它似乎不能被任何命令行标志覆盖

查看Chromium源代码,是片段导致了它:

// "5. Terminate these steps if |name| is a forbidden header name."
// No script (privileged or not) can set unsafe headers.
if (FetchUtils::IsForbiddenHeaderName(name)) {
  LogConsoleError(GetExecutionContext(),
                  "Refused to set unsafe header \"" + name + "\"");
  return;
}
每当您使用
Cookie
作为
header
参数调用时,就会调用此方法,这就是jQuery的
$.ajax({})
在后台使用的方法

有关某些客户端可能禁用此行为的原因的详细信息,请参阅

是禁止的标题名称的完整列表:

ForbiddenHeaderNames::ForbiddenHeaderNames()
    : proxy_header_prefix_("proxy-"), sec_header_prefix_("sec-") {
  fixed_names_ = {
      "accept-charset",
      "accept-encoding",
      "access-control-request-headers",
      "access-control-request-method",
      "connection",
      "content-length",
      "cookie",
      "cookie2",
      "date",
      "dnt",
      "expect",
      "host",
      "keep-alive",
      "origin",
      "referer",
      "te",
      "trailer",
      "transfer-encoding",
      "upgrade",
      "user-agent",
      "via",
  };
}

修改chromium源代码是个坏主意,对于此任务,您只需创建扩展来修改请求头,而无需参数
-禁用web安全性

创建名为
headers\u ext
的文件夹,并添加以下文件

manifest.json

{
  "manifest_version": 2,
  "name": "Modify Request Headers",
  "version": "1.0",
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "<all_urls>",
    "tabs",
    "webNavigation"
  ],
  "background": {
    "scripts": ["background.js"]
  }
}

如果不是该域的cookies,它如何知道应该发送哪些cookies?是否有必要为任何域播种它所知道的所有cookie?一切正常,如果我能在我的ajax请求中发送cookie头,那将非常棒,我只有2个cookie值,必须传递到网络头。我想问你如何期望你的浏览器知道该做什么,考虑到你要求它做一些非标准的事情。javascript如何能够改变浏览器在这方面的行为?这远远超出了javascript的控制范围。是的,它可能是重复的。它不是标准的,这就是为什么我禁用了chrome安全性,它是为了我个人用于重复的机器人任务。@xatap好吧,它是开源的,所以你可以很容易地做到这一点。似乎删除对我链接到的
FetchUtils::IsForbiddenHeaderName()
的调用就足够了。有教程吗?我正在使用mac,我要下载Chrome或者我可以使用Chrome Canary编辑它的代码?嗨,我完全按照你说的做了,我得到错误500和CORB阻塞错误,当我在inspect元素中看到标头时,cookie标头没有通过。嗨,我在extenstion中得到错误,事件处理程序中的错误:TypeError:无法读取第16Hi行中未定义的属性'length',如何与您聊天?您有一个拼写错误requestHeaders而不是responseHeaders,我已修复它,但仍收到允许源错误。请检查inspect元素好吗?Cookie在请求头中不存在,而且我也无法更改来源和引用者
function modifyRequestHeaders(request) {
  for (var headers = request.requestHeaders, i = 0; i < headers.length; ++i) {
    if (headers[i].name.toLowerCase() == 'accept') {
      // set Cookie from 'Accept' header value
      headers.push({"name" : "Cookie", "value" : headers[i].value});
      // normalize 'Accept' header value
      headers[i].value = '*/*';
    }
  }
  return {requestHeaders: headers};
}

function modifyResponseHeaders(response) {
  for (var headers = response.responseHeaders, i = 0; i < headers.length; ++i) {
    if (headers[i].name.toLowerCase() == 'access-control-allow-origin') {
      headers.splice(i, 1);
      break;
    }
  }

  // Allow cross domain
  headers.push({"name": "Access-Control-Allow-Origin", "value": "*"});
  return {responseHeaders: headers};
}

var webRequestOptions = {urls: ["<all_urls>"], types: ["xmlhttprequest"]};

chrome.webRequest.onBeforeSendHeaders.addListener(modifyRequestHeaders,
  webRequestOptions, ["blocking", "requestHeaders", 'extraHeaders']);
chrome.webRequest.onHeadersReceived.addListener(modifyResponseHeaders,
  webRequestOptions, ["blocking", "responseHeaders"]);
$.ajax({
  url: 'https://example.com',
  type: 'POST', // or GET or HEAD
  headers: {
    // it will used for 'Cookie' value by extension
    'Accept': "cookieName=cookieValue" 
  }
});