Javascript getAllResponseHeaders()不会像Chrome 60中预期的那样返回头

Javascript getAllResponseHeaders()不会像Chrome 60中预期的那样返回头,javascript,ajax,google-chrome,header,xmlhttprequest,Javascript,Ajax,Google Chrome,Header,Xmlhttprequest,在我们的web应用程序中,我们使用XHR.getAllResponseHeaders()-函数获取标题字段名。我们使用X-Access-Token来接收我们在下一个请求中发送的JWT令牌,以保持会话。从今天起,在登录后,下一个请求都会重定向回登录页面 奇怪的是,只有Chrome出现了这个问题,而不是Firefox或Safari。它只在我的电脑上,因为我的同事仍然可以登录,而我不能 我们使用相同的软件,一些javascript,所有东西都是一样的,所以我们注意到它必须与我的浏览器有关。尝试重新安装

在我们的web应用程序中,我们使用
XHR.getAllResponseHeaders()
-函数获取标题字段名。我们使用
X-Access-Token
来接收我们在下一个请求中发送的JWT令牌,以保持会话。从今天起,在登录后,下一个请求都会重定向回登录页面

奇怪的是,只有Chrome出现了这个问题,而不是Firefox或Safari。它只在我的电脑上,因为我的同事仍然可以登录,而我不能

我们使用相同的软件,一些javascript,所有东西都是一样的,所以我们注意到它必须与我的浏览器有关。尝试重新安装并禁用一些插件,但这并不重要


我看起来像是
XHR.getAllResponseHeaders()
函数返回了错误的值,尽管我们从服务器发送了正确的值。。。有人知道为什么它不再工作了吗?

经过大量的搜索、调试、测试和挫折之后,我们终于发现Chrome 60中的标题字段名称转换成小写,在Chrome 59的合同中(在我同事的pc上),这些名称保持不变。因此,标题字段名现在是
x-access-token
,而不是
x-access-token

对于那些在javascript中某处使用
XHR.getAllResponseHeaders()
-函数,并且正在使用Chrome或其客户机的人:准备好修补javascript以保持其正常工作,因为自从Chrome 60以来,XHR.getAllResponseHeaders()函数现在只输出小写的标题字段名

有些人也有同样的问题:

@壁虎:啊#Chrome 60在XHR.getAllResponseHeaders()中强制标头名称为小写,这让我崩溃了

另见: ,以及

根据github和google小组的讨论,我们被告知执行区分大小写的字符串比较可能是件坏事。在上传的HTTP/2中,所有的头都是小写的。因此,在HTTP/1.1中,XHR规范也将其所有头更改为小写。Chrome(60)是第一个改变这一点的人,但是Gecko/Firefox()和Webkit/Safari的补丁已经可以使用了

我们用一些简单的代码进行了测试,但是当从我们的服务器发送头
Foo:Bar
时,
XHR.getAllResponseHeaders()
-函数(在Chrome 60中)的输出将是'Foo:Bar'

因此,为了让它在所有浏览器中都能正常工作,并且能够经得起未来的考验:确保对响应中的头字段名执行不区分大小写的比较。这可以通过在处理标头之前使用
XHR.getAllResponseHeaders().toLowerCase()
或使用类似
XHR.getAllResponseHeaders().match(/foo/i)的不区分大小写的regexp来实现以查找它们

编辑:经过更多测试后。。。我们发现使用
XHR.getResponseHeader()
也是从请求头获取值的安全方法。基于上面的示例,当发送标题
Foo:Bar
时,无论使用
XHR.getResponseHeader('Foo')
还是
XHR.getResponseHeader('Foo')
,两者都将输出值“Bar”

委员会确认:

对标头名称的搜索不区分大小写


在我的例子中,看起来头实际上是“请求”头,而不是响应头。Chrome的网络调试器显示返回“application/json”,这就是服务器发送的内容,但是当XHR.getAllResponseHeaders()返回时。。它将“multipart/form data”作为内容类型,它是请求头值,而不是响应头值。这破坏了jQuery检测和解析响应类型的能力。这将彻底破坏互联网。什么!?根据上面的注释:“注意:对于多部分请求,它从请求的当前部分返回头,而不是从原始通道返回头。”因此,根据设计,一个名为“getAllResponseHeaders”的方法从请求返回头?真不可思议。