是否有可能强制Chrome在XMLHttpRequest中不发送cookie头?我看到Firefox有一个anon参数,但是在Chrome / Webkit上是否有类似的东西?
是否有可能强制Chrome在XMLHttpRequest中不发送cookie头?我看到Firefox有一个anon参数,但是在Chrome / Webkit上是否有类似的东西?
fetch
替代 XMLHttpRequestfetch
目前仍然缺少一些在 XMLHttpRequest
中存在的功能。这是否是一个问题,取决于您具体的示例。当你在Firefox中提到匿名请求,我相信你指的是像这样的代码:
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();
在Chrome中,使用XMLHttpRequest
是不可能的,但今天你可以通过使用fetch API来避免发送cookie,该API有一个类似的选项叫做credentials
,它允许您控制是否应包括cookie('include'
)或不包括('omit'
):
fetch('http://www.example.com', { credentials: 'omit' }).then(...);
这将发出一个不设置任何cookie的GET请求。
与XMLHttpRequest
相比,在功能方面仍存在一些限制。从我的角度来看,最紧迫的问题是您无法中止使用fetch
启动的请求,也无法控制超时。
有一个新的标准支持可中止的fetch
(请参见AbortController API),但目前仅在Firefox 57和Edge(2017年11月)上实现。它很快会到Chrome,但如果您需要此功能,则可能无法等待所有浏览器都支持它。
尽管如此,一旦有了AbortController
,我认为它将成为避免发送cookie的首选方式。
选项2:webRequest API并手动删除“Cookie”头
如果您现在需要一个可行的解决方案,并且您在扩展中有权限访问webRequest API,您可以安装一个onBeforeSendHeaders
监听器并手动删除Cookie
头。chrome.webRequest.onBeforeSendHeaders.addListener((details) => {
return {
requestHeaders: details.requestHeaders.filter(x => x.name.toLowerCase() !== 'cookie');
};
}, { urls: ['<all_urls>'] }, ['requestHeaders', 'blocking']);
details.requestId
是否匹配。为了获取请求 ID,我使用了另一个onBeforeRequestListener并验证了请求的 URL 是否匹配。当请求完成时,所有监听器都将被删除。(有关更多详细信息,请参见如何获取新请求的 requestId?。)crendentials:'omit'
直接的解决方案XMLHttpRequest
(-)当前浏览器尚未支持所有功能(超时、取消)