在我们的Web应用程序中,我们使用XHR.getAllResponseHeaders()-function来获取标头字段名称。我们使用X-Access- Token来接收JWT令牌,该令牌在下一个请求中发送以保持会话。从今天开始,登录后,每个下一个请求都导致重定向回到登录页面。
XHR.getAllResponseHeaders()
X-Access- Token
奇怪的是,只有Chrome出现了此问题,而不是Firefox或Safari。它只是在我的电脑上,因为我的同事仍然可以登录,而我却无法登录。
我们使用相同的软件,一些javascript,所有内容,因此我们注意到它必须与我的浏览器配合使用。尝试重新安装并禁用了一些插件,但这没关系。
我似乎XHR.getAllResponseHeaders()函数返回了错误的值,尽管我们从服务器发送了正确的值……有人知道为什么它不再起作用了吗?
经过大量的搜索,调试,测试和无奈之后,我们终于发现Chrome 60中的标头字段名称转换为小写字母,与Chrome 59(在我同事的电脑上)保持不变,这是他们的名字。所以标题字段名称现在x-access-token是X-Access-Token
x-access-token
X-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。
Foo: Bar
因此,为了使它在所有浏览器中都可以使用并适应未来发展:确保对响应中的标头字段名称执行不区分大小写的比较。可以通过XHR.getAllResponseHeaders().toLowerCase()在处理标题之前使用或使用不区分大小写的正则表达式(例如XHR.getAllResponseHeaders().match(/foo/i);查找它们)来轻松完成此操作。
XHR.getAllResponseHeaders().toLowerCase()
XHR.getAllResponseHeaders().match(/foo/i);
编辑: 经过更多测试…我们发现使用 XHR.getResponseHeader()也是从请求的标头获取值的安全方法。根据上面的示例,在发送标头时Foo: Bar,无论我们使用XHR.getResponseHeader('Foo')还是 XHR.getResponseHeader('foo')都无所谓,两者都将输出值“ Bar”。
XHR.getResponseHeader()
XHR.getResponseHeader('Foo')
XHR.getResponseHeader('foo')
该MDN文档XHR.getResponseHeader证实了这一点:
XHR.getResponseHeader
标题名称的搜索不区分大小写。