Actionscript 3 Flash中的跨域问题
我有两个swf文件托管在不同的域aaa.com/a.swf和bbb.com/b.swf上。a、 swf正在加载b.swf并试图将其转换到某个接口。当这两个swf文件都在同一个域下时,一切正常。但是,当它们位于不同的域中时,在将b.swf强制转换到实现的接口IComponent之后,我会得到null。这两个SWF都是使用use network=true和相同的IComponent.as编译的Actionscript 3 Flash中的跨域问题,actionscript-3,flash,Actionscript 3,Flash,我有两个swf文件托管在不同的域aaa.com/a.swf和bbb.com/b.swf上。a、 swf正在加载b.swf并试图将其转换到某个接口。当这两个swf文件都在同一个域下时,一切正常。但是,当它们位于不同的域中时,在将b.swf强制转换到实现的接口IComponent之后,我会得到null。这两个SWF都是使用use network=true和相同的IComponent.as编译的 public class Wrapper extends Sprite { public func
public class Wrapper extends Sprite
{
public function Wrapper()
{
super();
var request:URLRequest = new URLRequest("http://aaa.com/Component.swf");
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadingComplete);
loader.load(request,loaderContext);
addChild(loader);
}
private function onLoadingComplete(event:Event):void
{
var target:LoaderInfo = event.target as LoaderInfo;
var component:IComponent = target.content as IComponent;
component.init({"s":1});
component.run();
}
}
public class Component extends Sprite implements IComponent
{
public function Component()
{
super();
Security.allowInsecureDomain("*");
}
public function init(params:Object):void
{
//some actions
}
public function run():void
{
//some actions
}
}
我关于语法错误的想法毫无意义,这里有一个编辑: 此代码:
private function ololo():void{
var request:URLRequest = new URLRequest("http://domain/file.swf");
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.applicationDomain = ApplicationDomain.currentDomain;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadingComplete);
loader.load(request,loaderContext);
}
private function onLoadingComplete(e:Event):void {
var target:LoaderInfo = e.target as LoaderInfo;
addChild(target.content as Sprite);
}
即使文件位于完全不同的域上,也可以正常工作如果将您的
i组件
视为Sprite
,它是否有效?也许您必须通过crossdomain.xml文件设置跨域安全策略
例如:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy
SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*.example.com" />
</cross-domain-policy>
试试这个:
//Assuming you've set a crossdomain policy file
var loaderContext:LoaderContext =
new LoaderContext( true , ApplicationDomain.currentDomain )
它不起作用的原因似乎与IComponent未被识别或存在定义冲突这一事实有关。我本以为ApplicationDomain设置为currentDomain时,应该避免定义冲突。。。但将每个主权财富基金留在各自的领域可能是值得的
//Assuming you've set a crossdomain policy file
var loaderContext:LoaderContext =
new LoaderContext( true );
您还可以在加载其他SWF之前检查IComponent是否“存在”。这有助于诊断发生了什么
var ClassName:Object = getDefinitionByName('IComponent');
trace( ClassName );
谢谢大家的回答,我今天找到了一个有效的解决方案。 我不是将加载的内容强制转换为IComponent,而是将其强制转换为object
var component:Object = (event.target as LoaderInfo).content as Object;
component["init"](null);
component["run"]();
我从测试中证实,即使我们使用带有静态字段和方法的共享类,它也不起作用。包装器和组件都在实例化它们自己的共享类实例。真奇怪
如果您有相同的问题,请确保您的包装器/组件类具有安全性。allowDomain调用这是播放机中的一个错误: 当您尝试在从不同域加载的主权财富基金之间“共享”接口时,就会发生这种情况。如果你将两个主权财富基金放在同一个应用程序域下(正如你所做的那样),这应该是可行的 使用对象是可行的,但有点违背了使用接口的初衷 这里有一个解决方法,基本上是将swf作为二进制文件加载,然后使用
Loader::loadBytes
将swf实际加载到内存中:
我假设Wrapper是a.swf的文档类,Component是b.swf的文档类。target.content是否正在加载?你能查出来吗?是的。包装器正在加载组件,然后试图将其强制转换为IComponent(您的代码与我的代码完全相同。)强制转换为Sprite不是一个好主意。@Pul Yuriychuck如果您将其视为Sprite,那么您的代码是否有效?我认为这是有用的信息实际上是精灵,但我的代码似乎无法将精灵投射到IComponent接口。接口对我来说更重要,我需要调用组件方法;并且得到了SecurityError异常,因此您的假设是正确的。谢谢您的想法,我希望这会有所帮助。;)Wrapper.swf和Component.swf都是使用完全相同的IComponent接口编译的,没有定义冲突。尽管如此,我还是会尝试使用getDefinitionByName来确定。非常感谢您提出了问题的根本原因。当父swf文件和子swf文件托管在同一域下时,接口工作正常。