小编典典

如何从跨域Ajax请求访问Content-Length标头?

ajax

我的JavaScript应用程序需要确定资源的长度, 然后 才能使用Ajax下载资源。通常这不是问题,您只需发出HEAD请求并提取即可Content- Length

var xhr = $.ajax({type:"HEAD", url: "http://own-domain/file.html"})
xhr.getResponseHeader("Content-Length")  
// "2195"

但是,资源存储在与客户端不同的服务器上。(我控制的服务器)。因此,我正在使用CORS发出跨域Ajax请求,并已设置服务器以使用自定义标头响应HEAD请求和GET
/ POST请求的预检请求。

总的来说,这很有效,但是Content-Length在使用CORS时,我似乎找不到一种从HEAD响应中提取出来的方法:

var xhr = $.ajax({type:"HEAD", url: "http://other-domain/file.html"})
xhr.getResponseHeader("Content-Length")
// ERROR: Refused to get unsafe header "Content-Length"

我已经尝试在预检或响应中设置各种标题,例如

Access-Control-Expose-Headers: Content-Length

规范似乎建议应使其可用。但是,无论我做什么,我似乎都无法将Content-Length标头提供给客户端。有什么建议?

(Chrome 8)


阅读 566

收藏
2020-07-26

共1个答案

小编典典

我发现所有浏览器中对CORS响应标头的支持都是错误的。在Chrome / Safari中,即使是“ Access-Control-Expose-
Headers”标头,我也只能在getAllResponseHeaders()的结果中看到简单的响应标头(http://www.w3.org/TR/cors/#terminology)在响应中设置。在Firefox
3.6.13中,getAllResponseHeaders()不会返回任何内容(甚至不是简单的响应头)。作为一种解决方法,我想您可以重载其中一个简单的响应标头以包含内容长度,但这可能会导致其他问题,并且仍然无法修复Firefox。

2020-07-26