¿Cómo llamo a un Flex SWF desde un dominio remoto usando Flash (AS3)?
-
08-06-2019 - |
Pregunta
Tengo un swf Flex alojado en http://www.a.com/a.swf.Tengo un código flash en otro dominio que intenta cargar el SWF:
_loader = new Loader();
var req:URLRequest = new URLRequest("http://services.nuconomy.com/n.swf");
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderFinish);
_loader.load(req);
En el evento onLoaderFinish intento cargar clases desde el SWF remoto y crearlas:
_loader.contentLoaderInfo.applicationDomain.getDefinition("someClassName") as Class
Cuando se ejecuta este código, aparece la siguiente excepción
SecurityError: Error #2119: Security sandbox violation: caller http://localhost.service:1234/flashTest/Main.swf cannot access LoaderInfo.applicationDomain owned by http://www.b.com/b.swf.
at flash.display::LoaderInfo/get applicationDomain()
at NuconomyLoader/onLoaderFinish()
¿Hay alguna forma de hacer que este código funcione?
Solución
Todo esto se describe en El PDF de programación de Adobe Flex 3 ActionScript 3 en la página 550 (Capítulo 27:Seguridad de Flash Player/scripting cruzado):
Si dos archivos SWF escritos con ActionScript 3.0 se entregan desde dominios diferentes (por ejemplo, http://siteA.com/swfA.swf y http://siteB.com/swfB.swf—entonces, de forma predeterminada, Flash Player no permite que swfA.swf genere scripts de swfB.swf, ni que swfB.swf genere scripts de swfA.swf.Un archivo SWF otorga permiso a archivos SWF de otros dominios llamando a Security.allowDomain().Al llamar a Security.allowDomain("siteA.com"), swfB.swf otorga a los archivos SWF de siteA.com permiso para crear secuencias de comandos.
Continúa con más detalle, con diagramas y todo.
Otros consejos
Necesitará un archivo de política crossdomain.xml en el servidor que tiene el archivo que carga, debería verse así:
<?xml version="1.0"?>
<!-- http://www.foo.com/crossdomain.xml -->
<cross-domain-policy>
<allow-access-from domain="www.friendOfFoo.com" />
<allow-access-from domain="*.foo.com" />
<allow-access-from domain="105.216.0.40" />
</cross-domain-policy>
Colóquelo como crossdomain.xml en la raíz del dominio desde el que está cargando.
También es necesario configurar el cargador para leer este archivo como tal:
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onComplete );
loader.load( new URLRequest( "http://my.domain.com/image.png" ), loaderContext );
ejemplo de código extraído de http://blog.log2e.com/2008/08/15/when-a-cross-domain-policy-file-is-not-enough/
Quizás Sistema.Seguridad.allowDomain es lo que necesitas?