萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 軟體知識 >  >> 影像處理 >> Flash 教學

Flash AS3 跨域問題完整解決方案指南

跨域是 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)。

五大解決方案

1. Flash Player 全域安全設置(僅限本地開發測試)

  • Flash IDE:文件→發布設置→Flash 標籤→「僅限本地檔案」/「僅限網路」。選「僅限網路」可訪問網路資源,但本地測試會受限。
  • 控制面板→Flash Player→高級→受信任位置設定→添加本地專案目錄(開發機專用,不適用部署環境)。

2. ActionScript 代碼放寬權限

// 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"。

3. HTML 嵌入參數允許腳本互訪

<param name="allowScriptAccess" value="always" />
<embed ... allowScriptAccess="always" />

always:允許 SWF 與頁面 JS 雙向通信。sameDomain(預設):僅同域。never:禁止。

4. 跨域策略文件 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");

5. 瀏覽器差異與除錯技巧

  • IE 識別 <object> 標籤;Firefox/Chrome 識別 <embed> 標籤 → **兩者皆須設置 allowScriptAccess="always"**。
  • 常見錯誤 "... is not a function" 排查:
    ① ExternalInterface.addCallback 是否成功註冊?
    ② allowScriptAccess 是否 always?
    ③ **SWF 是否完全載入完成** 再調用 JS?(最常見:過早調用)。
  • 錯誤 "Error calling method on NPObject":
    ① 跨域策略問題(參考方案 4)。
    ② AS 函數內部拋出異常(加 try-catch 定位)。

最佳實踐清單

  1. 生產環境**嚴禁** allowDomain("*") 與 domain="*",嚴格白名單制。
  2. HTTPS 站點資源全走 HTTPS,避免 allowInsecureDomain。
  3. 跨域策略文件放置於**資源服務器根目錄**,並設置正確 Content-Type: text/xml。
  4. 動態載入策略文件(Security.loadPolicyFile)需在**首次資源請求前**調用。
  5. 本地開發配置「受信任位置」,部署環境走正規策略文件流程。
copyright © 萬盛學電腦網 all rights reserved