跨域是 Flash 開發中最常見的棘手問題。本文系統梳理跨域產生原因、影響範圍,並提供五大層面的解決方案:Flash Player 安全設置、ActionScript 代碼、HTML 參數、跨域策略文件、瀏覽器差異處理,助你徹底攻克跨域難題。
Flash 位於域名 A(如 a.com),嘗試訪問域名 B(b.com)的資源(XML、圖片、SWF、Socket 連線等),即觸發跨域安全限制。
Flash Player 安全沙箱機制:防止惡意 SWF 竊取用戶在其他域的敏感數據(Cookie、Session、本地文件),屬於「同源策略」在 Flash 端的實現。
URLLoader/URLStream 載入失敗(IOError #2032)。Loader 載入外部 SWF/圖片無法存取內部屬性/方法(SecurityError #2122)。Sound 載入 MP3 無法獲取頻譜數據(SoundMixer.computeSpectrum 失效)。ExternalInterface 呼叫 JS 失敗(Error calling method on NPObject)。// AS2
System.security.allowDomain("*");
System.security.allowInsecureDomain("*");
// AS3
import flash.system.Security;
Security.allowDomain("*"); // 允許所有域 SWF 腳本互訪
Security.allowInsecureDomain("*"); // 允許 HTTPS SWF 載入 HTTP 資源(不推薦生產環境)
注意:AS2 無 flash.system 包,切勿照抄 AS3 寫法。僅允許特定域時將 * 替換為 "a.com", "b.com"。
<param name="allowScriptAccess" value="always" /> <embed ... allowScriptAccess="always" />
always:允許 SWF 與頁面 JS 雙向通信。sameDomain(預設):僅同域。never:禁止。
crossdomain.xml(核心方案)置於**被訪問資源所在服務器的根目錄**(如 b.com/crossdomain.xml):
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="www.a.com" />
<allow-access-from domain="a.com" />
<allow-access-from domain="192.168.1.100" />
<!-- 允許所有域:<allow-access-from domain="*" /> -->
</cross-domain-policy>
Flash 載入資源前會自動請求此文件。若策略文件不在根目錄,可主動載入:
Security.loadPolicyFile("https://b.com/subdir/crossdomain.xml");
<object> 標籤;Firefox/Chrome 識別 <embed> 標籤 → **兩者皆須設置 allowScriptAccess="always"**。"... is not a function" 排查:ExternalInterface.addCallback 是否成功註冊?allowScriptAccess 是否 always?"Error calling method on NPObject":try-catch 定位)。allowDomain("*") 與 domain="*",嚴格白名單制。allowInsecureDomain。Content-Type: text/xml。Security.loadPolicyFile)需在**首次資源請求前**調用。