一尘不染

XHR.getAllResponseHeaders()未按预期在Chrome 60中返回标头

ajax

在我们的Web应用程序中,我们使用XHR.getAllResponseHeaders()-function来获取标头字段名称。我们使用X-Access- Token来接收JWT令牌,该令牌在下一个请求中发送以保持会话。从今天开始,登录后,每个下一个请求都导致重定向回到登录页面。

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

我们使用相同的软件,一些javascript,所有内容,因此我们注意到它必须与我的浏览器配合使用。尝试重新安装并禁用了一些插件,但这没关系。

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


阅读 520

收藏
2020-07-26

共1个答案

一尘不染

经过大量的搜索,调试,测试和无奈之后,我们终于发现Chrome 60中的标头字段名称转换为小写字母,与Chrome
59(在我同事的电脑上)保持不变,这是他们的名字。所以标题字段名称现在x-access-tokenX-Access-Token

对于那些XHR.getAllResponseHeaders()在某处的javascript中使用-
function且正在使用Chrome或其客户端的用户:准备好对您的javascript进行修补以保持其正常运行,因为 自Chrome
60起,XHR.getAllResponseHeaders()-函数现在仅输出小写的标头字段名称!

一些有相同问题的人:https :
//twitter.com/thegecko/status/890346862875742210

@thegecko:Argg!#Chrome 60强制XHR中的标头名称变为小写。getAllResponseHeaders()破坏了我!

另请参阅:https : //groups.google.com/a/chromium.org/forum/#!
topic /blink-
dev/_oxlCPNsrck ,https :
//github.com/whatwg/xhr/issues/146和更改日志位于https://chromium.googlesource.com/chromium/src/+/99c274ae8e7d366261dcfb89e0b98e733fb9d5f4

根据github和google组中的讨论,我们被警告说,执行区分大小写的字符串比较可能不是一件好事。在即将到来的HTTP /
2中,所有标头均为小写。因此,XHR规范在HTTP / 1.1中也更改为小写所有标头。Chrome(60)是第一个更改此设置的人,但是Gecko /
Firefox(https://bugzilla.mozilla.org/show_bug.cgi?id=1370485)和Webkit
/ Safari的补丁已可用。

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

因此,为了使它在所有浏览器中都可以使用并适应未来发展:确保对响应中的标头字段名称执行不区分大小写的比较。可以通过XHR.getAllResponseHeaders().toLowerCase()在处理标题之前使用或使用不区分大小写的正则表达式(例如XHR.getAllResponseHeaders().match(/foo/i);查找它们)来轻松完成此操作。

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

MDN文档XHR.getResponseHeader证实了这一点:

标题名称的搜索不区分大小写。

2020-07-26