读取S3对象的ajax GET请求的所有响应头

时间:2017-06-12 11:32:41

标签: ajax google-chrome amazon-web-services amazon-s3

问题概述: 我通过预签名文件的CORS请求访问存储在AWS S3存储桶中的文件列表。这基本上工作正常。但是,对象附加了一些自定义的METADATA,我无法访问它们。我明白,只有当我将标题键(例如" x-amz-meta-1234",其中1234是我的元数据的关键字)添加到目标的Expose-Headers时,我才能访问此元数据-bucket的CORS配置。虽然这对我来说到目前为止工作,但是我不能用通配符设置expose-header(例如" x-amz-meta - *"),这可以解决我的问题,但是AWS没有& #39; t支持expose-header条目的通配符。

但是,当我查看Chrome Dev Tools的NETWORK选项卡时,GET / HEAD请求期间所有需要的元数据都显示在标题中(请注意下半部分的条目,x-amz-meta-4021和-template_id): response headers of request in chrome

这是我的HEAD电话:

            $.ajax({
                url: url,                      
                dataType: 'json',
                crossDomain: true,
                type: 'HEAD',
                success: function(data, status, jqXHR) {
                    console.log('got some response ..?');
                    console.log(data);
                    console.log(jqXHR);
                    console.log('responseHeader template_id: ' + jqXHR.getResponseHeader('x-amz-meta-template_id'));
                    console.log('responseHeader meta-4021: ' + jqXHR.getResponseHeader('x-amz-meta-4021'));
                    console.log(jqXHR.getAllResponseHeaders());
                },
                error: function(error, xhr, data) {
                    console.log('in error..');
                    console.log(error);
                    console.log(xhr);
                    console.log(data);
                }
            });
        });

这是控制台输出:

Object {readyState: 4, getResponseHeader: function, getAllResponseHeaders: 
function, setRequestHeader: function, overrideMimeType: function…}
responseHeader template_id: 813
responseHeader meta-4021: null
x-amz-meta-template_id: 813
Last-Modified: Fri, 09 Jun 2017 13:05:33 GMT
Content-Type: video/mp4

我为元数据条目' template_id'设置了expose-header。显式,因此为此条目正确返回标头数据。但是,对于参赛作品#40;'我没有设置expose-header。问题是,这个元数据(和键)是由我们的(android / ios)应用程序生成的,我无法轻易地控制元数据的键。

让我困惑的是:为什么我能够在Chrome网络标签中看到整个响应,但无法从客户端脚本访问此数据?有许多可能的解决方法和解决方案,但我基本上想了解,为什么我的浏览器可以显示数据,jQuery无法访问这些数据。

PS:如果您想查看CORS配置或完整脚本,请告诉我。我试着尽可能精确。提前谢谢!

1 个答案:

答案 0 :(得分:1)

  

我基本上想了解,为什么我的浏览器可以显示数据,jQuery无法访问这些数据。

要理解这一点,您需要了解CORS的目的。

CORS并非真正关于访问控制,而CORS并不是真正在您的网站上工作。 CORS正在代表用户和浏览器工作,以防止浏览器成为confused deputy并做一些用户不想要的事情。这通常与网站本来不想要的东西相吻合,但那是次要的。

浏览器的默认行为是假设对跨源请求的编程访问是错误的,这就是为什么在没有Access-Control-Allow-Origin标头时拒绝它们的原因。您的银行不希望internetbadguys.com向银行网站发出ajax请求,如果该网站尝试过,浏览器会阻止它,除非该银行的网络服务器愚蠢地允许它进行CORS响应。

CORS是一种机制,让您的网站告诉浏览者,"是的,您所做的跨域请求并非意料之外,它是允许的......并且从此响应中,浏览器是允许参与某些行为,例如将以下响应标题暴露给发出请求的代码。"

从这个角度来看,你观察到的行为是正确的。公开标题(或不公开)并不意味着将它们包含在HTTP响应中(或不公开) - 公开标题使浏览器有权向ajax调用者公开它所知道的内容。如果交叉起源要求它们暴露,则必须明确。