【问题标题】:Access control problems with cache-control and canvas缓存控制和画布的访问控制问题
【发布时间】:2016-06-02 10:16:03
【问题描述】:

我正在尝试使用浏览器画布来处理我在云端托管的图像。我正在尝试设置 cloudfront 以使浏览器缓存具有缓存控制 max-age 的图像,并且仍然允许画布编辑这些图像。

这是我可以编辑的图像:

https://d2t4fc8ff77neh.cloudfront.net/cardSrcImage/1ac01l796_16dbmg07t_books2.jpg

这是我不能的(来自“https://d2t4fc8ff77neh.cloudfront.net”的图像已被跨域资源共享策略阻止加载:请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'https://localhost' 因此不允许访问。):

https://d2t4fc8ff77neh.cloudfront.net/cardSrcImage/1ac01o3l0_16dbmg07t_books2.jpg

唯一不同的是缓存控制标头。怎么了?谢谢。

我正在使用 node.js knox 库进行上传。示例标题:

var headers = {
  'Content-Length': options.data.length,
  'Vary': 'Accept-Encoding',
  // 'Cache-Control': 'public, max-age=31536000',
  'x-amz-acl': 'public-read',
  'Content-Type': options.type
}

【问题讨论】:

  • 要解决“...因此不允许访问”错误,您可以尝试将'Access-Control-Allow-Origin': '*' 添加到您的headers 对象;这允许每个人都使用CORS,但至少可以排除这个问题。
  • @Castaglia 我补充说,但仍然有同样的问题。我认为 x-amz-acl 公开阅读是亚马逊的等价物?

标签: javascript amazon-web-services http-headers amazon-cloudfront cache-control


【解决方案1】:

好的,我假设您只想加载图像并且不想将它们保存(POST)回相同的URI。这行得通!

Here 是一个适用于两个图像的 jsbin。代码如下:

var img1 = new Image();
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');


//drawing of the test image - img1
img1.onload = function () {
  ctx.drawImage(img1, 0, 0);
};

//img1.src = 'https://d2t4fc8ff77neh.cloudfront.net/cardSrcImage/1ac01l796_16dbmg07t_books2.jpg';
img1.src = 'https://d2t4fc8ff77neh.cloudfront.net/cardSrcImage/1ac01o3l0_16dbmg07t_books2.jpg';

还有 html 中的canvas

<canvas id="canvas" width="1000" height="1000"></canvas>

所以你的问题可能是你如何加载图像,但你还没有向我们展示你的代码。

缓存/跨域问题

您的问题是 &lt;img&gt; 标记和 Javascript Image 具有非常不同的行为。您可以使用 &lt;img&gt; 标签包含来自互联网的所有图像,而无需进行任何来源检查,但对于 Javascript Image,您的相同来源策略是有效的。

在您原来的HTML 中,您的图像有&lt;img&gt; 标签。这会使您的浏览器获取没有Origin 标头的图像。这会导致您的服务器不发送 CORS 标头。

稍后当您使用 Javascript Image 时,您的浏览器会有一个缓存版本没有 CORS 标头,并且会对此做出响应。所以请求会失败!

有时看起来 chrome 足够智能,可以发出额外的请求,但这绝对不理想。

现在应该很容易解决这个问题。也许先使用Image,然后再使用&lt;img&gt; 标签,或者根本不使用&lt;img&gt; 标签。即使没有 Origin 标头,您也可以始终为 * 发送 CORS 标头。


您的resizing 函数中还有一个奇怪的问题,但我认为如果您自己无法解决,这是一个新问题的内容。

【讨论】:

  • 由于 CORS,图像编辑对第一张图像效果很好,但对第二张图像效果不佳。请尝试一下,你会看到。
  • jsbin 确实 对我有用。请显示您的无效代码!另外:你用的是什么浏览器? jsbin 是否为您在画布中显示图像?
  • 哦,对不起。奇怪的是,在我发布第二张图片时,我并没有按照我的意愿调整大小,而第一张图片确实如此。现在这两个图像不再在我的代码下调整大小。我能够上传另一个这样做的。诡异的! jsbin.com/kikinucowi/edit?html,css,js,console,output
  • 是的,你的 jsbin 对我有用。抱歉,我的代码可能有问题。我主要是从tympanus.net/codrops/2014/10/30/resizing-cropping-images-canvas复制过来的
  • 好的,我想我已经看到了你的两个问题。我很确定它们完全不相关。首先,您有一些非常奇怪的缓存问题。其次,您有时无法调整图像大小。但这是因为您的 resizing 函数中存在错误。 e.originalEvent.touches 有时是 undefined
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2019-04-13
  • 2012-01-16
  • 1970-01-01
相关资源
最近更新 更多