Flash跨域問題相信不是所有人都可以遇到,如果你在本地發(fā)布,或者說直接Ctrl+Enter在FlashIDE中預(yù)覽,是不會(huì)遇到跨域問題的,當(dāng)然,跨域有個(gè)前提,那就是Flash不是完全獨(dú)立的,與外界要做一些通信和交互,如果你的Flash是完全獨(dú)立的文件,沒有和外界發(fā)生任何交互和數(shù)據(jù)通信的話,那么你可以不考慮跨域問題,因?yàn)檫@也不存在跨域問題。什么是跨域? 跨域簡單的說就是訪問其他域名的文件或資源,比如a.com的Flash去訪問b.com的資源,那么就會(huì)引起跨域的問題,因?yàn)閍.com和b.com不是同一個(gè)域名。為什么有跨域問題? 其實(shí)不僅僅是Flash,Javascript等一些腳本也有跨域的問題,這個(gè)主要是自身的安全機(jī)制所決定的,因?yàn)榭缬蛟L問一些文件或資源有一定的危險(xiǎn)性,他超過了網(wǎng)站自身的范圍,對于站外的資源無法審核其安全性,在網(wǎng)絡(luò)病毒木馬日益猖獗的今天,跨域限制訪問是其安全策略的一個(gè)重要解決手段。跨域有什么問題? 跨域的問題有很多,最直接的就是所訪問的文件被限制了,這樣一來,你的Flash就不能正常工作了,所以是讓人很頭疼的一件事情。現(xiàn)在的Flash已經(jīng)不僅僅是作為一個(gè)動(dòng)畫了,更多的有了數(shù)據(jù)交互,所以和外界的通信來作為一個(gè)互動(dòng)性比較強(qiáng)的媒介來展現(xiàn),跨域也是其中必須解決的一個(gè)問題。恩,那也許有人說了,既然有跨域的問題,那我把資源都放在同一個(gè)域名下不就可以了?恩,的確可以這樣做,但是有時(shí)候我們也會(huì)遇到訪問外部資源的情況,而且在一個(gè)比較正規(guī)的項(xiàng)目中,F(xiàn)lash和Html往往是分開放的,很多公司也是這樣,為了便于維護(hù)和管理,所以跨域的問題就容易出現(xiàn)。1、Flash自身的安全機(jī)制設(shè)置: Flash中,在IDE運(yùn)行是沒有任何安全限制的,但是發(fā)布出去的話,就會(huì)有不少限制,F(xiàn)lash有2中發(fā)布方式,一個(gè)是僅訪問網(wǎng)絡(luò),一個(gè)是僅訪問本地,大家可以在文件-發(fā)布設(shè)置-Flash選項(xiàng)卡中看到,注意必須是在Flash文件有效時(shí)才會(huì)有哦,如果當(dāng)前編輯的是as文件是木有這個(gè)選擇菜單的: 這里就已經(jīng)限制了Flash的安全級別,如果是只訪問本地,那么Flash中所有的對Web的訪問都將禁止,而只訪問網(wǎng)絡(luò)的話,對本地的文件訪問都將禁止,所以大家根據(jù)實(shí)際的用途來選擇,如果你希望你的Flash放到Web上,那么就選擇只訪問網(wǎng)絡(luò),這樣的話你測試就務(wù)必放在WebService中測試了,本地運(yùn)行就會(huì)出現(xiàn)各種問題(如果有數(shù)據(jù)通信的話),例如:測試URLhttp://127.0.0.1/123.swf。2、ActionScript代碼設(shè)置: AS2寫法:復(fù)制代碼代碼如下:System.security.allowDomain("*");//針對不同http資源System.security.allowInsecureDomain("*");//針對需要安全驗(yàn)證的資源,比如httpsAS3寫法:復(fù)制代碼代碼如下:flash.system.Security.allowDomain("*");flash.system.Security.allowInsecureDomain("*");上面就是嚴(yán)格的寫法,AS3還好說,大家要注意一下AS2,AS2是木有flash.system這個(gè)包的,但是你import flash.system并不會(huì)報(bào)錯(cuò),所以如果你把AS3的代碼復(fù)制進(jìn)去運(yùn)行雖然一切正常,但是實(shí)際是木有任何效果的。一定要注意!上面的代碼就是說允許Flash去訪問任何URL資源,如果只想訪問特定的URl,就把*改成該URL即可,如果多個(gè)URl,就用逗號分隔就可以了,注意allowInsecureDomain是允許訪問帶驗(yàn)證的URL資源,比如https打頭的,如果你訪問的只是普通http的話就不需要了。3、html的設(shè)置:
如果你需要和頁面的JS通信,那么html里就必須有這樣一個(gè)參數(shù):復(fù)制代碼代碼如下:<param name="allowScriptAccess" value="always" />參數(shù)always表示始終允許腳本訪問,如果是never,就表示始終不允許。4、加載外部資源: 如果你要讀取一個(gè)外部文件,比如swf,picture,mp3等等,那么就需要一個(gè)跨域策略文件(crossdomain.xml),這個(gè)其實(shí)就是一個(gè)xml文件,具體內(nèi)容是:復(fù)制代碼代碼如下:<?xml version="1.0"?><cross-domain-policy> <allow-access-from domain="www.explorechn.com" /> <allow-access-from domain="explorechn.com" /> <allow-access-from domain="223.4.119.191" /></cross-domain-policy>這就是跨域策略文件,allow-access-from domain表示允許訪問的URl,如果有多個(gè)依次添加,如果允許所有就一個(gè) allow-access-from domain = "*"就可以了。需要說明一下這個(gè)文件該怎么用,如果你的Flash在a.com下,你需要訪問b.com的資源,那么把這個(gè)xml放在b.com的根目錄就可以自動(dòng)訪問了,當(dāng)然,你也可以訪問其他目錄的策略文件。復(fù)制代碼代碼如下:flash.system.Security.loadPolicyFile(URL:String);通過這個(gè)loadPolicyFile就可以主動(dòng)去加載一個(gè)安全策略文件了,注意上面是AS3的寫法,AS2不一樣哦,參考上面的寫法。5、各個(gè)瀏覽器的跨域問題: IE就不說了,這個(gè)基本沒啥問題,包括Flash自己生成的Html就對IE的支持做的很好,這里就說說Chrome和FF的問題:對于FLash,IE是認(rèn)object標(biāo)簽的,但是FF和Chrome是認(rèn)embed標(biāo)簽的,所以這個(gè)很重要,如果在調(diào)試的時(shí)候,發(fā)現(xiàn)firebug等工具提示"...... is not a Function",我們就要從以下地方查找原因: 1、addCallback是否成功注冊 2、allowScriptAccess是否允許always,默認(rèn)不允許 3、Flash是否完全加載完畢 一般來說,第三點(diǎn)是我們最容易遇到的,如果你的Flash沒有加載完畢就去調(diào)用函數(shù)的話,是找不到這個(gè)函數(shù)的。 這里需要注意另外一個(gè)錯(cuò)誤提示,就是"Error calling method on NPObject",如果出現(xiàn)這個(gè)錯(cuò)誤,就要小心了: 1、安全策略問題,請參考上面所有的解決方案 2、自身函數(shù)錯(cuò)誤
|
新聞熱點(diǎn)
疑難解答
圖片精選