IE10和跨域资源共享(CORS)问题与图像/画布



我一直以为Internet Explorer 10完全支持CORS,但现在我不确定了。

我们有一个JS/HTML5应用程序,使用多个域,并读取图像数据。我们在JS中从另一个域加载图像,imageDraw()将图像加载到画布上,然后在画布上使用getImageData。(我们不使用跨域xmlhttprequest)。为此,我们必须在提供图像的服务器上设置响应头:

access-control-allow-origin: *
access-control-allow-credentials: true

并在加载前将其设置在JS中的image对象上:

image.crossOrigin = 'Anonymous'; //Also tried lowercase

这在所有新浏览器上都可以正常工作,除了IE10,当我们尝试读取数据时,会抛出安全错误。

SCRIPT5022: SecurityError

是否需要为IE10做更多的事情来处理这些跨域图像而不是污染?

更新:

我注意到了前面一个问题的答案。有趣的是,这个JSFiddle也不能在IE10中工作-有人能确认这不能在他们的IE10中工作吗?

不幸的是,IE10仍然是唯一一个不支持CORS的流行浏览器,即使CORS标头被正确设置。但也可以通过XMLHttpRequest:

解决这个问题
var xhr = new XMLHttpRequest();
xhr.onload = function () {
    var url = URL.createObjectURL(this.response), img = new Image();
    img.onload = function () {
        // here you can use img for drawing to canvas and handling
        // ...
        // don't forget to free memory up when you're done (you can do this as soon as image is drawn to canvas)
        URL.revokeObjectURL(url);
    };
    img.src = url;
};
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.send();

确认:IE10不支持HTML 5画布中的CORS图像。rreverver的解决方案

编辑

对不起,我以前没有处理过CORS图像,并认为这个问题是关于AJAX请求的

根据Mozilla开发人员网络,需要设置"image.crossOrigin"为"anonymous"或"use-credentials"。而且,根据今天的页面,这些属性在IE、Safari和Opera中都不支持。这个测试是为了证明IE9不支持它,似乎同样的测试在IE10中仍然失败,所以即使Safari和Opera在MDN文章写完后增加了支持,IE10很可能仍然缺乏支持。

我能给您的唯一提示是,通常,allow-credentials与通配符allow-origin不兼容。要么删除allow-凭据,要么回显allow-origin中的请求Origin。

下面是AJAX调用,而不是图像或视频画布资源

早期版本的IE10已知有AJAX漏洞,

  • http://bugs.idsl.pl/ie/xhr.htm
  • http://connect.microsoft.com/IE/feedback/details/771552/i-e-10-and-the-post-method

所以这可能是另一个浏览器错误。不过,CORS的正确设置似乎很棘手。我建议按照以下步骤调试CORS问题。

  1. 将浏览器指向http://test-cors.appspot.com/#technical以获取兼容性报告。如果有任何失败,则说明浏览器中存在错误或缺乏对CORS的支持。
  2. 如果一切顺利,使用测试发送的CORS标头作为起点,以使CORS请求工作。然后一次更改一个标头并重新测试,直到您获得应用程序所需的标头,或者您遇到无法解释或解决的故障。
  3. 如果有必要,发布一个关于打破CORS请求的一个微小变化的问题,发布工作"之前"和失败"之后"。如果您可以包含一个可运行的示例,这总是有帮助的。

CORS测试客户端和服务器的完整代码(Google App Engine的Python脚本)可在https://github.com/rapportive-oss/cors-test获得,以帮助您开始。

最新更新