[AS3] LoaderContext 解決跨域加載

原文:http://xiazhihui321.blog.163.com/blog/static/81328893201082515529386/
編程

網絡上有關AS3跨域讀取swf、圖片報錯案例有不少種了,面對老是報「checkPolicyFile」錯誤信息,在服務器上設置了crossdomain.xml文件都沒用的,讓不少閃友頭痛好久,其實咱們一般用LoaderContext類來解決,請看如下代碼:
跨域

import flash.display.Loader;
import flash.net.URLRequest;
import flash.system.LoaderContext;
var aPolce:LoaderContext = new LoaderContext(true);
var loader:Loader = new Loader();
loader.load(new URLRequest(http://xxxxxxxx/xxxx.xxx),aPolce);
//須要在原來的調用基礎增長LoaderContext類;
LoaderContext屬於flash.system。使用 Loader.load() 方法加載 SWF 文件時,須要作出兩個決定:應將所加載的 SWF 文件放置到哪一個安全域中,以及應放置到該安全域中的哪一個應用程序域中。
而使用 Loader.loadBytes() 方法加載 SWF 文件時,只要選擇應用程序域,但沒必要指定安全域,這是由於 Loader.loadBytes() 始終將其加載的(子swf) SWF 文件放置到執行加載(父:swf)的 SWF 文件的安全域。
若是是加載圖像(JPEG、GIF 或 PNG)而不是 SWF 文件,則無需指定安全域或應用程序域,這是由於這些概念只對 SWF 有意義。 此時您只需作出一個決定:是否須要以編程方式訪問所加載圖像的像素。
LoaderContext含有3個公共屬性:
applicationDomain : ApplicationDomain = null
指定用於 Loader.load() 或 Loader.loadBytes() 方法的應用程序域。

checkPolicyFile : Boolean = false
指定 Flash Player 是否應在開始加載對象自己以前,嘗試從所加載對象的服務器上下載跨域策略文件。

securityDomain : SecurityDomain = null
指定用於 Loader.load() 操做的安全域

LoaderContext(checkPolicyFile:Boolean = false, applicationDomain:ApplicationDomain = null, securityDomain:SecurityDomain = null)
建立帶有指定設置的新 LoaderContext 對象。

applicationDomain屬性 

指定用於 Loader.load() 或 Loader.loadBytes() 方法的應用程序域。 只應在加載使用 ActionScript 3.0 編寫的 SWF 文件(不是圖像或使用 ActionScript 1.0 或 ActionScript 2.0 編寫的 SWF 文件)時才使用此屬性。
checkPolicyFile屬性

指定 Flash Player 是否應在開始加載對象自己以前,嘗試從所加載對象的服務器上下載跨域策略文件。 此標誌適用於 Loader.load() 方法,但不適用於 Loader.loadBytes() 方法。
如 果從執行調用的 SWF 文件(父swf)所在的域以外加載圖像(JPEG、GIF 或 PNG),而且須要從 ActionScript 訪問該圖像的內容,請將此標誌設置爲 true。 訪問圖像內容的示例包括引用 Loader.content 屬性以得到 Bitmap 對象,以及調用 BitmapData.draw() 方法以得到所加載圖像像素的副本。 若是在加載時沒有指定 checkPolicyFile,就會獲得一個 SecurityError 異常,這是由於沒有
下載所需的策略文件。
securityDomain屬性
指定用於 Loader.load() 操做的安全域。 只應在加載 SWF 文件(圖像文件不須要)時使用此屬性。只有在被加載的 SWF 文件與執行加載的 SWF 文件可能來自不一樣的域(不一樣的服務器)時,選擇安全域纔有意義。 在從其它域加載 SWF 文件時,有兩種方法:
1,能夠容許將被加載的 SWF 文件放置到其「天然的」安全域中,此安全域與執行加載的 SWF 文件的安全域不一樣;這是默認設置。
2, 另外一種選擇是經過將 myLoaderContext.securityDomain 設置爲與 SecurityDomain.currentDomain 相同,指出但願將被加載的 SWF 文件放置到執行加載的 SWF 文件所在的安全域中。 這稱做導入加載,就安全性而言,它等同於將被加載的 SWF 文件複製到本地服務器,而後從該服務器加載它。 此時,被加載的(子swf)SWF 文件的服務器必須具備一個策略文件,而且該策略文件必須信任執行加載的 SWF 文件的(父)域。另外,只能在傳遞在LoaderContext.securityDomain設定的安全域。 若是試圖傳遞任何其它的安全域,則會引起 SecurityError 異常。
安全

StackOverflow的答案:
服務器

var context:LoaderContext = new LoaderContext(); 
context.checkPolicyFile = true; 
context.securityDomain = SecurityDomain.currentDomain; 
context.applicationDomain = ApplicationDomain.currentDomain; 
var request:URLRequest = new URLRequest("http://en.gravatar.com/avatar/" + gravatar + "?s=35&d=identicon"); 
var loader:Loader = new Loader(); 
loader.load(request, context);
相關文章
相關標籤/搜索