Pergunta

Eu tenho um SWF Flex hospedado em http://www.a.com/a.swf.Eu tenho um código flash em outro domínio que tenta carregar o SWF:

_loader = new Loader();
var req:URLRequest = new URLRequest("http://services.nuconomy.com/n.swf");
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderFinish);
_loader.load(req);

No evento onLoaderFinish tento carregar classes do SWF remoto e criá-las:

_loader.contentLoaderInfo.applicationDomain.getDefinition("someClassName") as Class

Quando este código é executado, recebo a seguinte exceção

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()

Existe alguma maneira de fazer esse código funcionar?

Foi útil?

Solução

Tudo isso está descrito em PDF do ActionScript 3 de programação do Adobe Flex 3 na página 550 (Capítulo 27:Segurança do Flash Player/script cruzado):

Se dois arquivos SWF gravados com ActionScript 3.0 forem fornecidos por domínios diferentes, por exemplo, http://siteA.com/swfA.swf e http://siteB.com/swfB.swf—então, por padrão, o Flash Player não permite que swfA.swf crie scripts de swfB.swf, nem swfB.swf crie scripts de swfA.swf.Um arquivo SWF concede permissão para arquivos SWF de outros domínios chamando Security.allowDomain().Ao chamar Security.allowDomain("siteA.com"), swfB.swf concede aos arquivos SWF do siteA.com permissão para criar scripts.

Continua com mais detalhes, com diagramas e tudo.

Outras dicas

Você precisará de um arquivo de política crossdomain.xml no servidor que contém o arquivo que você carregou. Ele deve ser parecido com isto:

<?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>

Coloque-o como crossdomain.xml na raiz do domínio do qual você está carregando.

Além disso, você precisa configurar o carregador para ler este arquivo 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 );

amostra de código extraída de http://blog.log2e.com/2008/08/15/when-a-cross-domain-policy-file-is-not-enough/

Talvez System.Security.allowDomain é o que você precisa?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top