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?

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top