问题概述: 我通过预签名文件的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):
这是我的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配置或完整脚本,请告诉我。我试着尽可能精确。提前谢谢!
答案 0 :(得分:1)
我基本上想了解,为什么我的浏览器可以显示数据,jQuery无法访问这些数据。
要理解这一点,您需要了解CORS的目的。
CORS并非真正关于访问控制,而CORS并不是真正在您的网站上工作。 CORS正在代表用户和浏览器工作,以防止浏览器成为confused deputy并做一些用户不想要的事情。这通常与网站本来不想要的东西相吻合,但那是次要的。
浏览器的默认行为是假设对跨源请求的编程访问是错误的,这就是为什么在没有Access-Control-Allow-Origin
标头时拒绝它们的原因。您的银行不希望internetbadguys.com向银行网站发出ajax请求,如果该网站尝试过,浏览器会阻止它,除非该银行的网络服务器愚蠢地允许它进行CORS响应。
CORS是一种机制,让您的网站告诉浏览者,"是的,您所做的跨域请求并非意料之外,它是允许的......并且从此响应中,浏览器是允许参与某些行为,例如将以下响应标题暴露给发出请求的代码。"
从这个角度来看,你观察到的行为是正确的。公开标题(或不公开)并不意味着将它们包含在HTTP响应中(或不公开) - 公开标题使浏览器有权向ajax调用者公开它所知道的内容。如果交叉起源要求它们暴露,则必须明确。