cesium的billboard加载阿里云图片报跨域问题
2021-04-29 本文已影响0人
姜治宇
使用cesium的billboard加载图片时,如果是阿里云的远程图片,则可能会出现跨域问题。
我们一般的做法是在服务器端设置header:
Access-Control-Allow-Origin: *
但是设置了之后仍会报跨域,怎么回事呢?
问题出在billboard是通过 TextureLoader 来加载图片的,我们看一下 TextureLoader 的源码,发现其进一步使用了 ImageLoader 来加载图片,加载图片的代码大致如下:
crossOrigin: 'anonymous',
......
var image = document.createElementNS( 'http://xxxx', 'img' );
......
if ( url.substr( 0, 5 ) !== 'data:' ) {
if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;
}
......
image.src = url;
也就是说,billboard会先创建一个img标签,如果图片没有设置crossOrigin属性的话,则会自动给图片设置属性:
crossOrigin: 'anonymous',
我们在本地localhost通过 dom 节点的 <img> 标签来直接访问图片是没问题的,因为浏览器本身不会有跨域问题。但是图片访问过以后,浏览器会在本地缓存一份。当我们从 JS 的代码中创建的 <img> 再去访问同一个图片时,浏览器就不会再发起新的请求,而是直接访问缓存的图片。但是由于 JS 中的 <img> 设置了 crossorigin,也就意味着它将要以 CORS 的方式请求,但缓存中的图片显然不是的,所以浏览器直接就拒绝了。连网络请求都没有发起。
如果我们在 Chrome 的调试器的 network 面板中,勾选了 disable cache 选项,这时跨域问题就不存在了,可问题是我们无法强制用户选择。
解决方案
这个问题的最终解决方案是——强制绕过billboard对crossOrigin的设置:
<img src="xxxx" crossorigin="undefined" />