為了安全性的考量,flash或flex ActionScript在3.0版大幅修改了跨網(wǎng)域(cross-domain)存取的設(shè)定方式。
以下假設(shè)有A、B兩臺server,A server存放了swf檔及網(wǎng)頁,但是圖片放在B server上。client端連到了A server後如要觀看圖片都要透過從A server的swf檔讀取B server的資料。
在這樣的情況下,html網(wǎng)頁是可以直接將<img src=""/>指向B server的圖片,例如<img src="http://b.example.com/image.png"/>但是flash就不行,當(dāng)swf檔企圖讀取時就會跳出安全性錯誤。
解決方法:
1.在B server網(wǎng)頁的root下放置crossdomain.xml,內(nèi)容是
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="a server的ip或domain" />
</cross-domain-policy>
例如A server是a.example2.com.tw,則xml檔為
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="a.example2.com.tw" />
</cross-domain-policy>
注意,一定要在根目錄下,不能在虛擬目錄下。舉例:http://b.example.com/dir/crossdomain.xml這樣是不行的
2.A server的swf檔內(nèi)容必須增加這幾行
Security.loadPolicyFile("http://b.example.com/crossdomain.xml");
//讀取B server的安全性設(shè)定檔
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;
//設(shè)定安全性物件
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(event:Event):void{
Image.source = event.currentTarget.content;
});
loader.load(new URLRequest(encodeURI("http://b.example.com/image.png")), loaderContext);
//宣告Loader讀取圖片,並在load時予許跨網(wǎng)域存取
有些麻煩,但是為了user的安全。
參考網(wǎng)頁
http://blancer.com/tutorials/30030/quick-tip-a-guide-to-cross-domain-policy-files/