Question

Je vais être aussi précis et bavard que possible et inclure une partie du code que j'utilise. J'ai déjà fait une recherche et trouvé cette question , qui semble similaire; Cependant, l'auteur utilisait ActionScript 2 au lieu de 3 et je ne paraissais pas appliquer efficacement les réponses apportées à ma propre situation.

J'essaie d'émuler (de manière limitée) le comportement de l'objet XMLHttpRequest de JavaScript via Flash / ActionScript 3, afin de surmonter la limitation du même domaine. Mais je découvre qu'ActionScript a ses propres limites à cet égard. J'admets que je peux me tromper, mais d'après ce que j'ai compris, il est théoriquement encore possible d'effectuer ce type de script entre domaines à l'aide d'ActionScript, à condition d'obtenir toutes les autorisations nécessaires. Et c’est là que j’ai des problèmes.

Tout d'abord, j'ai emprunté du code libre pour une classe appelée AjaxRequest , que j'ai enregistré sous le nom /ajax/AjaxRequest.as . J'ai ensuite créé un fichier Flash appelé /jsajax.fla qui exporte vers le fichier SWF final, /jsajax.swf . Maintenant, voici le code ActionScript qui constitue la première et unique image du fichier Flash:

import ajax.AjaxRequest;
Security.allowDomain("domainone.com");
Security.allowDomain("domaintwo.com");

function jsAjax(stringURL:String, stringMethod:String, stringData:String):void
{
    var xhr:AjaxRequest = new AjaxRequest(stringURL);
    xhr.contentType = "application/x-www-form-urlencoded";
    xhr.dataFormat = URLLoaderDataFormat.TEXT;

    if ( stringMethod.toUpperCase() == "POST" ) {
        xhr.method = URLRequestMethod.POST;
    } else {
        xhr.method = URLRequestMethod.GET;
    }

    xhr.addEventListener("complete", jsAjaxResponse);
    xhr.send(stringData);
    return;
}

function jsAjaxResponse(evt:Event):void
{
    ExternalInterface.call("jsAjaxResponse", evt.currentTarget.data.toString());
    return;
}

ExternalInterface.addCallback("jsAjax", jsAjax);
ExternalInterface.call("jsAjaxReady");

Jusqu'ici tout va bien. J'ai l'impression qu'un ou plusieurs de ces appels Security.allowDomain ne sont pas nécessaires, mais ce sont mes tentatives (infructueuses) pour tenter de résoudre ce problème.

Dans mon code JavaScript, trois fonctions sont définies: jsAjax , jsAjaxResponse et jsAjaxReady . La dernière est simplement une fonction très basique utilisée pour indiquer que l’objet Flash a été chargé avec succès (qui n’est appelé qu’une fois et immédiatement après son chargement), les deux autres étant utilisés pour l’envoi et la réception des données. Comme vous pouvez le constater, ils ont des équivalents ActionScript correspondants.

Enfin, j'ai créé une page HTML simple appelée /test.html qui incorpore ce fichier SWF (à l'aide de swfobject ) et dispose de quelques contrôles de formulaire simples pour appeler la fonction jsAjax . Toutes mes définitions JavaScript sont également intégrées à ce fichier HTML. J'ai également créé un script PHP très simple appelé /test.php , qui affiche le contenu du tableau $ _ REQUEST . C'est le script que j'ai l'intention de demander à l'aide de cette méthode ajax.

J'ai testé trois scénarios, mais je n'ai pu en faire fonctionner que deux:

SCÉNARIO UN: tous sur un serveur
Si je télécharge tous ces fichiers sur domainone.com, puis demande test.php, cela fonctionne bien. Ma structure de fichier / dossier se présente alors comme suit:

domainone.com/jsajax.swf
domainone.com/test.html
domainone.com/test.php

Encore une fois, cela fonctionne . La fonction jsAjaxResponse reçoit parfaitement les données de test.php.

SCÉNARIO DEUX: sur les deux serveurs, penché à gauche
Lorsque j'ai téléchargé le code HTML et le fichier SWF sur le premier serveur, puis que je l'ai simplement appelé le script PHP sur le deuxième serveur, cela ne fonctionnait pas tout de suite. J'ai fait quelques recherches et j'ai constaté qu'en créant un fichier crossdomain.xml sur domaintwo.com autorisant l'accès à domainone.com, cela a résolu le problème. Donc, ma structure de fichiers / dossiers ressemblait à ceci:

domainone.com/jsajax.swf
domainone.com/test.html
domaintwo.com/test.php
domaintwo.com/crossdomain.xml

Lorsque vous autorisez explicitement domainone.com dans le fichier crossdomain.xml, cela fonctionne . De nouveau, la fonction jsAjaxResponse reçoit les données de test.php sans problème.

SCÉNARIO TROIS: sur les deux serveurs, penchez-vous à droite
Lorsque j'ai téléchargé tout le contenu, sauf le code HTML, sur domaintwo.com, je ne pouvais plus le faire fonctionner. En d'autres termes, le code HTML sur domainone.com fait référence à un fichier SWF hébergé sur domaintwo.com, et ce fichier SWF tente de faire une demande à domaintwo.com. J'ai laissé le même fichier crossdomain.xml de Scenario 2, juste au cas où. Ma structure de fichier / dossier ressemblait à ceci:

domainone.com/test.html
domaintwo.com/jsajax.swf
domaintwo.com/test.php
domaintwo.com/crossdomain.xml

C’est le seul cas où je n’ai pas pu travailler et c’est le cas pour lequel j’ai besoin de travailler. Les deux premiers n'étaient en réalité que des scénarios de test pour voir si le script fonctionnait. Lorsque j'essaie d'exécuter ma fonction jsAjax ici, une erreur qui apparaît deux fois dans Firebug s'affiche:

uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.].
uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.].

Aide! Comment puis-je le faire fonctionner dans le scénario 3?

Était-ce utile?

La solution

Je viens de le comprendre! Cela avait à voir avec les commandes Security.allowDomain dans mon fichier Flash. En fait, j’hébergeais le test.html sur un sous-domaine de domainone.com, et c’était en train de le détruire. Ce doit être une correspondance exacte, un sous-domaine et tout. Il s'avère que je n'avais pas besoin de la commande Security.allowDomain qui faisait référence à domaintwo.com, ni du fichier crossdomain.xml pour qu'il soit présent dans Scénario 3. !

Depuis dans le "réel" version de ce script que je finis par utiliser, je ne saurai pas nécessairement ce que domainone.com est réellement, j’ai modifié le code situé en haut du fichier Flash:

import ajax.AjaxRequest;
try {
    var domain1:String = LoaderInfo(this.root.loaderInfo).parameters["allow"];
    if ( domain1.length > 0 ) {
        Security.allowDomain(domain1);
    }
} catch (error:Error) { }
try {
    var domain2:String = LoaderInfo(this.root.loaderInfo).parameters["allowhttps"];
    if ( domain2.length > 0 ) {
        Security.allowInsecureDomain(domain2);
    }
} catch (error:Error) { }
...

Ensuite, dans le code JavaScript que j'utilise pour intégrer le fichier SWF à cet emplacement, je récupère le domaine actuel de la page dans document.location.toString () , puis vérifiez si utilisez http ou https, puis transmettez le domaine sous la forme allow et / ou allowhttps dans le paramètre flashvars. Il pourrait y avoir un "meilleur" façon de faire cela qui ne repose pas sur la définition explicite du domaine dans Flash Vars (une sorte de détection automatique à partir de Flash), mais je ne connais pas assez bien ActionScript pour comprendre cela. Et comme ce fichier utilise déjà de nombreuses communications bidirectionnelles entre JavaScript et ActionScript, ce n'est pas un gros problème. Cette solution me convient assez bien.

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