我想在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的情况下,与Cookie
一起使用时XMLHttpRequest
标头是被禁止的,并且似乎不能被任何命令行标志覆盖。
查看Chromium源代码,this是负责此代码的片段:
// "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;
}
[只要您将XMLHttpRequest.setRequestHeader(header, value)
作为XMLHttpRequest.setRequestHeader(header, value)
参数调用Cookie
,就会调用此方法,这就是jQuery的header
在幕后使用的。
有关为什么某些客户端可能禁用此行为的更多信息,请参见$.ajax({})
。
this answer是禁止的标头名称的完整列表:
Here
修改铬源代码是一个坏主意,对于此任务,您只需创建扩展即可修改请求标头,而无需参数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",
};
}
使用-disable-web-security
之类的名称创建文件夹并添加以下文件
manifest.json
headers_ext
backround.js
{
"manifest_version": 2,
"name": "Modify Request Headers",
"version": "1.0",
"permissions": [
"webRequest",
"webRequestBlocking",
"<all_urls>",
"tabs",
"webNavigation"
],
"background": {
"scripts": ["background.js"]
}
}
现在,在Chrome扩展页面中,单击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"]);
并找到目录。
上述扩展名将仅修改Load unpacked extension
请求标头,并将xmlhttprequest
标头值用作Accept
值,它还通过添加标头Cookie
来修改响应标头以允许跨域请求。
对于Chrome,似乎Access-Control-Allow-Origin: *
标头尚未列入安全列表,所以我改用DPR, Downlink, Save-Data, Viewport-Width, Width
标头来避免Accept
或OPTIONS
请求,因为许多网站不支持此标头。并且Preflight
是过滤器,允许修改或创建Preflight
。
有关更多CORS信息,请阅读extraHeaders
确保您使用的是最新的Chrome浏览器,并像这样创建请求
Cookie