Question

J'ai un swf Flex hébergé sur http://www.a.com/a.swf.J'ai un code flash sur un autre domaine qui essaie de charger le SWF :

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

Lors de l'événement onLoaderFinish, j'essaie de charger des classes à partir du SWF distant et de les créer :

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

Lorsque ce code s'exécute, j'obtiens l'exception suivante

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-t-il un moyen de faire fonctionner ce code ?

Était-ce utile?

La solution

Tout cela est décrit dans Le PDF de programmation Adobe Flex 3 ActionScript 3 à la page 550 (Chapitre 27 :Sécurité de Flash Player / Cross-scripting) :

Si deux fichiers SWF écrits avec ActionScript 3.0 sont servis à partir de domaines différents (par exemple : http://siteA.com/swfA.swf et http://siteB.com/swfB.swf- alors, par défaut, Flash Player n'autorise pas swfA.swf à scripter swfB.swf, ni swfB.swf à scripter swfA.swf.Un fichier SWF autorise les fichiers SWF provenant d'autres domaines en appelant Security.allowDomain().En appelant Security.allowDomain("siteA.com"), swfB.swf autorise les fichiers SWF de siteA.com à créer un script.

Cela continue plus en détail, avec des diagrammes et tout.

Autres conseils

Vous aurez besoin d'un fichier de stratégie crossdomain.xml sur le serveur qui contient le fichier que vous chargez, il devrait ressembler à ceci :

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

Placez-le sous le nom crossdomain.xml à la racine du domaine à partir duquel vous effectuez le chargement.

Vous devez également configurer le chargeur pour qu'il lise ce fichier comme tel :

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

exemple de code extrait de http://blog.log2e.com/2008/08/15/when-a-cross-domain-policy-file-is-not-enough/

Peut-être Système.Security.allowDomain c'est ce dont tu as besoin ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top