使用cesium的billboard加載圖片時茉稠,如果是阿里云的遠程圖片描馅,則可能會出現(xiàn)跨域問題。
我們一般的做法是在服務器端設置header:
Access-Control-Allow-Origin: *
但是設置了之后仍會報跨域战惊,怎么回事呢流昏?
問題出在billboard是通過 TextureLoader 來加載圖片的扎即,我們看一下 TextureLoader 的源碼吞获,發(fā)現(xiàn)其進一步使用了 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會先創(chuàng)建一個img標簽各拷,如果圖片沒有設置crossOrigin屬性的話,則會自動給圖片設置屬性:
crossOrigin: 'anonymous',
我們在本地localhost通過 dom 節(jié)點的 <img> 標簽來直接訪問圖片是沒問題的闷营,因為瀏覽器本身不會有跨域問題烤黍。但是圖片訪問過以后,瀏覽器會在本地緩存一份傻盟。當我們從 JS 的代碼中創(chuàng)建的 <img> 再去訪問同一個圖片時速蕊,瀏覽器就不會再發(fā)起新的請求,而是直接訪問緩存的圖片娘赴。但是由于 JS 中的 <img> 設置了 crossorigin规哲,也就意味著它將要以 CORS 的方式請求,但緩存中的圖片顯然不是的诽表,所以瀏覽器直接就拒絕了唉锌。連網(wǎng)絡請求都沒有發(fā)起。
如果我們在 Chrome 的調(diào)試器的 network 面板中竿奏,勾選了 disable cache 選項袄简,這時跨域問題就不存在了,可問題是我們無法強制用戶選擇泛啸。
解決方案
這個問題的最終解決方案是——強制繞過billboard對crossOrigin的設置:
<img src="xxxx" crossorigin="undefined" />