flash與js跨域調用

flash與js跨域調用

之前用aflax調用網頁js一直比較正常,今天將aflax移到另一個域名下再調用原來域名的js發現失敗了。初步判斷是跨域調用的權限問題。

在FLASH腳本調用處加上參數:<param name="allowScriptAccess" value="always" />

在flash里加上:System.security.allowDomain("*");

問題得以解決。

allowScriptAccess

Flash Player 自版本 6 以來, 一直支持一個稱爲 allowScriptAccess 的 HTML 參數。此參數用於控制是否允許 SWF 中的 ActionScript 在包含它的 HTML 頁中調用 JavaScript。 (反之則不進行控制, 即 JavaScript 調用受 System.security.allowDomain 控制的 ActionScript。)

allowScriptAccess 可能存在如下值:

  • always: 始終允許 ActionScript 調用 JavaScript
  • sameDomain: 僅當 SWF 和 HTML 頁來自同一域時, 才允許 ActionScript 調用 JavaScript
  • never: 從不允許 ActionScript 調用 JavaScript

在 Flash Player 6 和 7 中, allowScriptAccess 的默認值 (如果未由 HTML 頁指定) 爲“always”。需要單獨說明的是, 在 Flash HTML 發佈模板中, allowScriptAccess 的默認值始終爲“sameDomain”。如果不修改 Flash HTML 發佈進程輸出, 那麼您將會看到“sameDomain”行爲, 這是因爲 HTML 頁會爲 Flash Player 指定“sameDomain”。

在 Flash Player 8 中, 當 Flash Player 中的主 SWF 爲 7 版或更早版本時, 未指定的 allowScriptAccess 的默認值將始終爲“always”, 而當主 SWF 爲 8 版或更高版本時, 該默認值會變爲“sameDomain”。

allowScriptAccess 參數允許 HTML 頁包括 Flash 內容, 但禁止它在 HTML 頁中執行腳本。當 HTML 頁源自它可能並不信任的 Flash 內容時, 這一點很有用。例如, 如果您負責維護一個論壇, 其中的用戶可能會包括他們自己製作的 SWF 簽名, 並且生成的 HTML 將直接源自這些 SWF, 那麼您可能不希望這些 SWF 能夠在您的 HTML 頁中執行腳本。

下面是有關如何指定 allowScriptAccess 的示例:

<objectclassid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"width="375" height="300" › <param name="movie" value="hello.swf" › <param name="allowScriptAccess" value="sameDomain" › <embedpluginspage="http://www.macromedia.com/go/getflashplayer_cn"type="application/x-shockwave-flash"src="hello.swf"width="375" height="300"allowScriptAccess="sameDomain" › </object ›allowDomain

從 Flash Player 8 開始, System.security.allowDomain() 接受單個星號“*”作爲通配符。調用 System.security.allowDomain("*") 的結果是允許通過所有 域而非特定域中的其它 SWF 進行腳本訪問。

如果您所在的環境中沒有需要保護的敏感數據, 並且您需要公開與其它域共享數據, 則使用此通配符權限會很方便。但在調用 System.security.allowDomain("*") 之前, 請確保調用 SWF 不包含需要保密或半保密的任何信息或 ActionScript 代碼。調用 System.security.allowDomain("*") 後, 來自 Internet 中任意位置的任意 SWF 都可以加載您的 SWF 並對其進行腳本處理, 即便 SWF 由惡意作者編寫時也是如此。

請注意, 在以下情況中, 您可能必須調用 System.security.allowDomain(), 即在運行之前, 您不知道提供協作 SWF 的域, 這可能是因爲協作 SWF 由負載平衡簇提供, 或者是因爲將在多個不同域中使用您的 SWF。在此情況下, 請勿盲目調用 System.security.allowDomain("*")!如上所述, 這將打開您的 SWF, 從而完全允許 Internet 上的其它任何 SWF 對其進行腳本處理。請等至協作 SWF 加載完畢, 然後使用 ActionScript property MovieClip._url 確定它的域。在將 _url 屬性值傳遞給 System.security.allowDomain() 之後, 引用的影片剪輯中的 SWF 應該能夠對調用 System.security.allowDomain() 的 SWF 進行腳本處理。

Flash Player 8 允許任意版本的 SWF 向 System.security.allowDomain() 傳遞“*”。但如果您要在低於 8 版的 SWF 中調用 System.security.allowDomain("*"), 那麼在執行操作前, 一定要測試播放器的版本 (System.capabilities.version) 看是否至少爲 8, 這是因爲較早版本的 Flash Player 不會將“*”識別爲 System.security.allowDomain 的參數。


另外還需要注意ActionScript代碼設置:

AS2寫法:System.security.allowDomain("*"); //針對不同http資源

    System.security.allowInsecureDomain("*"); //針對需要安全驗證的資源

AS3寫法:flash.system.Security.allowDomain("*");

   flash.system.Security.allowInsecureDomain("*");


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章