是否可以强制chrome不在XMLHttpRequest上发送cookie头。我看到Firefox有一个anon参数,但在chrome / webkit上有类似的东西吗?
答案 0 :(得分:0)
不幸的是,目前webextensions中没有直接的方式(在Firefox和Chrome中)。让我们看看替代方案:
fetch
代替XMLHttpRequest 选项1具有不涉及黑客的魅力,但缺点是UITextFields
目前仍然缺少fetch
中存在的某些功能。这是否是一个问题,取决于你的具体例子。
选项2需要使用webRequest API的权限,这需要其他权限。它看起来也应该比它应该更复杂。尽管如此,这是我工作的唯一方式,可以在今天的浏览器上使用(2017年11月)。
但是让我们详细看看这两个选项。
选项1:获取API及其限制
当您在Firefox中提及匿名请求时,我确定您的意思是这样的代码:
XMLHttpRequest
在Chrome中使用let xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Components.interfaces.nsIXMLHttpRequest);
xhr.open('GET', 'http://www.example.com');
xhr.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_ANONYMOUS;
xhr.send();
是不可能的,但您今天最接近的事情是避免使用fetch API发送Cookie,credentials
有一个名为AbortController API的类似选项,可让您控制是否应包含Cookie(XMLHttpRequest
)或不包括'include'
):
'omit'
这将在不设置任何cookie的情况下发出GET请求。
与fetch('http://www.example.com', { credentials: 'omit' }).then(...);
相比,在功能方面仍存在一些限制。从我的角度来看,最紧迫的问题是你无法中止以XMLHttpRequest
开头的请求,也无法控制超时。
有一项新标准可支持中止fetch
(请参阅onBeforeSendHeaders
),但目前仅在Firefox 57和Edge(2017年11月)上实施。它很快就会进入Chrome,但如果您现在需要这些功能,则可能无法等到所有浏览器都支持它。
但是,一旦fetch
存在,我认为它将成为避免发送cookie的首选方式。
选项2:webRequest API并删除' Cookie'手动标题
如果您现在需要有效的解决方案,并且您在扩展程序中有权访问webRequest API,则可以安装onBeforeRequestListener侦听器并手动删除AbortController
标题。
要想出一个主意,这就是它的样子:
Cookie
但是你必须要小心,不要意外地修改不相关的请求。在实际实现中,您应该验证chrome.webRequest.onBeforeSendHeaders.addListener((details) => {
return {
requestHeaders: details.requestHeaders.filter(x => x.name.toLowerCase() !== 'cookie');
};
}, { urls: ['<all_urls>'] }, ['requestHeaders', 'blocking']);
是否匹配。为了访问请求ID,我使用了另一个How to get the requestId of a new request?并验证了请求的URL是否匹配。请求完成后,将再次删除所有侦听器。 (有关详细信息,请参阅{{3}}。)
从我看来,它起作用但它不是一个非常优雅的解决方案。
<强>要点:强>
获取API:
details.requestId
crendentials: 'omit'
webRequest API: