我有多个SWF文件应该从外部服务器访问。为了能够做到这一点,我需要在每个SWF文件中都有Security.allowDomain。这里的问题是我没有FLA用于那些文件,并且有数千个SWF。
如果有更好的方法可以将这些文件配置为可从其他域访问? 就像拥有某种配置文件一样。
答案 0 :(得分:2)
是的,有一种解决方法,但我认为这是一个安全漏洞,所以它可以在任何版本的Flash播放器中修复。同时它现在可以使用,所以这里是解决方案 - 使用URLLoader
和BINARY
dataFormat
作为swf字节的预加载器:
swf没有脚本编写的安全权限:
package
{
import flash.display.MovieClip;
public class astest extends MovieClip
{
public function astest()
{
}
public function externalCheck():void
{
graphics.beginFill(0xFF0000);
graphics.drawCircle(100, 100, 100);
}
}
}
想要加载前一个swf并调用externalCheck
方法的加载程序swf:
package
{
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;
public class astest2 extends MovieClip
{
private var loader:Loader;
private var urlLoader:URLLoader;
public function astest2()
{
init();
}
//this method works fine
protected function init():void
{
urlLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.load(new URLRequest("http://domain_with_your_swfs/astest.swf"));
urlLoader.addEventListener(Event.COMPLETE, function(event:Event):void
{
addChild(loader = new Loader());
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoader);
loader.loadBytes(urlLoader.data as ByteArray);
});
}
//this method will fire SecurityError when calling the 'externalCheck' method
protected function init2(event:Event = null):void
{
addChild(loader = new Loader());
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoader);
loader.load(new URLRequest("http://domain_with_your_swfs/astest.swf"));
}
protected function onLoader(event:Event = null):void
{
var swf:Object = loader.content;
swf.externalCheck();
}
}
}
不要忘记将crossdomain.xml
文件放在服务器的根目录中并加载swf文件,如果没有它,URLLoader将无法加载字节,这是唯一的安全要求。