XHR.getAllResponseHeaders()不会按照Chrome 60中的预期返回标头

时间:2017-07-31 12:04:10

标签: javascript ajax google-chrome header xmlhttprequest

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

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

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

我看起来XHR.getAllResponseHeaders()函数返回了错误的值,虽然我们从服务器发送了正确的值...任何人都知道为什么它不再起作用了?

1 个答案:

答案 0 :(得分:14)

经过大量的搜索,调试,测试以及很多挫折之后,我们终于发现Chrome 60中的标题字段名称转换为小写,与合同中的Chrome 59(在我的同事的PC上)保持名称不变。因此,标题字段名称现在为x-access-token,而不是X-Access-Token

对于那些在他们的javascript中使用XHR.getAllResponseHeaders() - 功能,并且正在使用Chrome或他们的客户的人:准备好修补你的javascript以保持工作正常,因为< strong>自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/_oxlCPNsrckhttps://github.com/whatwg/xhr/issues/146以及https://chromium.googlesource.com/chromium/src/+/99c274ae8e7d366261dcfb89e0b98e733fb9d5f4

的更改日志

根据github和google组中的讨论,我们被警告说执行区分大小写的字符串比较可能是一件坏事。在upcomming 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() - 函数(在Chrome 60中)的输出将是`foo:Bar。

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

修改:经过更多测试...我们发现使用XHR.getResponseHeader()也是一种从请求标头中获取值的安全方法。根据上面的示例,在发送标题Foo: Bar时,如果我们使用XHR.getResponseHeader('Foo')XHR.getResponseHeader('foo')并不重要,两者都会输出值&#39; Bar&#39 ;

MDN documentation for XHR.getResponseHeader证实了这一点:

  

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