Flash Player 的安全沙箱機制規定:不同域的 SWF 與 HTML 頁面互相訪問需雙向授權(Security.allowDomain("*") + allowScriptAccess="always")。但在基於 IE 內核的多標籤瀏覽器(傲遊、360、騰訊瀏覽器等)中,刷新頁面時仍會拋出安全沙箱錯誤,導致 ExternalInterface 通信失效。本文深度分析根因並提供工程級解決方案。

SecurityError: Error #2060: 安全沙箱衝突: ExternalInterface 調用者 ... 不能訪問 ...
Flash 代碼示例:
package {
import flash.display.Sprite;
import flash.external.ExternalInterface;
import flash.system.Security;
import flash.text.TextField;
public class Main extends Sprite {
public function Main():void {
var tf:TextField = new TextField();
tf.text = 'flash ready';
tf.autoSize = 'left';
addChild(tf);
Security.allowDomain("*");
start();
}
private function start():void {
ExternalInterface.call("alert", "Hi, flash is ready!");
ExternalInterface.addCallback('drawCircle', drawCircle);
}
private function drawCircle():void {
// 繪圖邏輯...
}
}
}
test.swf?t=12345)強制繞過緩存| 方案 | 原理 | 優點 | 缺點 |
|---|---|---|---|
| SWF URL 加隨機數/時間戳 | 繞過瀏覽器緩存 | 簡單有效 | 增加伺服器壓力,頁面載入永遠慢 |
| 延遲初始化(推薦) | 延後 ExternalInterface.addCallback 執行時機 | 零額外請求,用戶無感,阿里巴巴生產環境驗證 | 需經驗調優延遲時間 |