javascript - Cookie 未由 Chrome 和 withCredentials 发送是真的
问题描述
Chrome 选择不在 GET 请求中发送 Cookie 标头。我重写XMLHTTPRequest
,以便当一个库调用时open()
,它调用原始实现,open()
然后设置withCredentials = true
。
我尝试了一个 netlog 查看器会话,但这似乎没有显示与 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
“发送前”而不是“打开后”来使其工作。在调用inxhr.send()
之前,xhr 对象的属性设置回为,即使它被设置为in 。 _httpSend()
withCredentials
false
true
xhr.open()
我仔细检查了这两个方法中的 xhr 对象是同一个对象,并且该属性实际上被设置为true
每个方法内部。不知何故,在调用和withCredentials
之间被重置了。所以我只是确保在发送请求之前将其设置为in 。xhr.open
xhr.send
true
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 中被重置并且我无权访问。
推荐阅读
- python - 如何在前端部分 django 中使用身份验证 api
- oracle - 试图创建一个函数 - 但出现此错误。PL/SQL:语句被忽略 10/8 PLS-00382:表达式类型错误
- r - R中的文档包
- javascript - 如何使用输入类型=范围自定义滚动条
- python - Heroku python with worker:如何传输数据
- firebase - 查询 Firestore 多级深度
- javascript - Promise.All 解决永远不会被 forEach 调用
- node.js - 无法通过代理服务器发送请求
- image - 为什么 PFM 具有相反的行顺序
- phpmyadmin - 如何在 PMA 搜索窗口中显示普通输入字段而不是下拉框