Chrome 选择不在 GET 请求中发送 Cookie 标头。 我正在覆盖XMLHTTPRequest
,以便当库调用open()
时,它会调用open()
的原始实现,然后设置withCredentials = true
。
我尝试过使用网络日志查看器会话,但这似乎没有显示与 cookie 相关的项目。 我尝试了不同的绑定技术,但我认为这个问题与上下文无关this
。 Cookie 在浏览器工具的"应用程序"下的 Cookie 列表中正常显示。域列为.mydomain.com
<script type="text/javascript">
document.cookie = "ATOKEN="d=dflskdjflsdkfj=1,"; Version=1; Domain=.mydomain.com; expires=Tues, 23 Jul 2019 20:54:04 GMT; Path=/";
// library makes request to a-subdomain.mydomain.com
var originalXMLHttpRequest = XMLHttpRequest;
XMLHttpRequest = function ()
{
var xhr = new originalXMLHttpRequest();
var _httpOpen = xhr.open.bind(xhr);
xhr.open = function (method, url, flag)
{
_httpOpen(method, url, flag ? flag : true);
if (url.indexOf('a-subdomain') >= 0)
{
xhr.withCredentials = true;
}
};
return xhr;
};
</script>
使用 Charles 代理查看 403 的请求,并注意 Cookie 标头不存在。 Cookie 标头应该与 Cookie 一起存在:...
我通过将withCredentials
设置为"发送前"而不是"打开后"来true
它的工作。 在调用_httpSend()
之前的xhr.send()
,xhr 对象的 withCredentials
属性被设置回 false
,即使它在 xhr.open()
中被设置为true
。
我仔细检查了 xhr 对象在两个方法中是否是同一对象,并且该属性实际上在每个方法中都设置为true
。 不知何故,withCredentials
在呼叫xhr.open
和xhr.send
之间被重置。所以我只是确保在发送请求之前将其设置为 true
in xhr.send
。
<script type="text/javascript">
document.cookie = 'ATOKEN="d=dflskdjflsdkfj=1,"; domain=.mydomain.com;';
// library makes request to a-subdomain.mydomain.com
var originalXMLHttpRequest = XMLHttpRequest;
XMLHttpRequest = function ()
{
var xhr = new originalXMLHttpRequest();
var _httpOpen = xhr.open.bind(xhr);
var _httpSend = xhr.send.bind(xhr);
var _url;
xhr.open = function (method, url, flag)
{
_url = url;
_httpOpen(method, url, flag ? flag : true);
};
xhr.send = function (body)
{
if (_url && _url.indexOf('a-subdomain') >= 0)
{
xhr.withCredentials = true;
}
_httpSend(body);
};
return xhr;
};
</script>
我不知道为什么此属性被重置,因为XMLHTTPRequest标准中的方法不涉及该属性。 也许它在我覆盖的第三方 Javascript 中被重置,我无法访问。