Domanda

Sarò il più specifico e dettagliato possibile e includerò parte del codice che sto usando. Ho già fatto una ricerca e ho trovato questa domanda , che sembra simile; tuttavia l'autore stava usando ActionScript 2 invece di 3, e non riuscivo ad applicare in modo efficace nessuna delle risposte fornite alla mia situazione.

Sto cercando di emulare (in modo limitato) il comportamento dell'oggetto XMLHttpRequest di JavaScript tramite Flash / ActionScript 3, al fine di superare la limitazione dello stesso dominio. Ma sto scoprendo che ActionScript ha i suoi limiti al riguardo. Ammetto che potrei sbagliarmi, ma da quello che capisco è teoricamente ancora possibile fare questo tipo di script tra domini usando ActionScript, purché tu abbia tutte le autorizzazioni giuste. Ed è qui che sto correndo nei guai.

Innanzitutto, ho preso in prestito del codice open source per una classe chiamata AjaxRequest , che ho salvato come /ajax/AjaxRequest.as . Ho quindi creato un file Flash chiamato /jsajax.fla che esporta nel file SWF finale, /jsajax.swf . Ora, ecco il codice ActionScript che comprende il primo e unico frame del file 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");

Finora tutto bene. Ho la sensazione che una o più di quelle chiamate Security.allowDomain non siano necessarie, ma sono stati i miei (falliti) tentativi di provare a risolvere questo problema.

Nel mio JavaScript, ho definito tre funzioni: jsAjax , jsAjaxResponse e jsAjaxReady . L'ultima è solo una funzione di base utilizzata per indicare che l'oggetto Flash è stato caricato correttamente (che viene chiamato solo una volta e immediatamente dopo il caricamento), mentre gli altri due vengono utilizzati per l'invio e la ricezione dei dati. Come puoi vedere, hanno le corrispondenti controparti ActionScript.

Infine, ho creato una semplice pagina HTML chiamata /test.html che incorpora questo file SWF (usando swfobject ) e ha un paio di semplici controlli dei form per chiamare la funzione jsAjax . Tutte le mie definizioni JavaScript sono incorporate anche in questo file HTML. Ho anche creato uno script PHP molto semplice chiamato /test.php che stampa il contenuto dell'array $ _REQUEST . Questo è lo script che intendo richiedere utilizzando questo metodo ajax.

Esistono tre scenari che ho testato, ma sono riuscito a farne funzionare solo due:


SCENARIO ONE: tutto su un server
Se carico tutti questi file su domainone.com e quindi richiedo test.php, funziona perfettamente. La mia struttura di file / cartelle si presenta così:

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

Ancora una volta, funziona . La funzione jsAjaxResponse restituisce bene i dati da test.php.


SCENARIO DUE: su entrambi i server, sporgendosi a sinistra
Quando ho caricato l'HTML e SWF sul primo server, e poi l'ho appena chiamato lo script PHP sul secondo server, non ha funzionato immediatamente. Ho fatto qualche ricerca, e ho scoperto che creando un file crossdomain.xml su domaintwo.com che consentiva l'accesso a domainone.com, questo è stato risolto. Quindi la mia struttura di file / cartelle sembrava così:

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

Quando consenti esplicitamente domainone.com nel file crossdomain.xml, funziona . Ancora una volta, la funzione jsAjaxResponse riceve i dati da test.php bene.


SCENARIO TRE: su entrambi i server, sporgendosi a destra
Quando ho caricato tutto tranne l'HTML su domaintwo.com, non sono più riuscito a farlo funzionare. In altre parole, l'HTML su domainone.com fa riferimento a un file SWF ospitato su domaintwo.com, un file

È stato utile?

Soluzione

L'ho appena capito! Ha avuto a che fare con i comandi Security.allowDomain nel mio file Flash. In realtà stavo ospitando il test.html su un sottodominio di domainone.com, e questo lo stava buttando via. Deve essere una corrispondenza esatta, sottodominio e tutto il resto. Si scopre che non avevo bisogno del comando Security.allowDomain che faceva riferimento a domaintwo.com, né avevo bisogno del file crossdomain.xml per essere presente per lo scenario 3 !

Dal momento che nel "reale" versione di questo script che finisco per usare, non saprò necessariamente cosa sia effettivamente domainone.com, ho cambiato il codice nella parte superiore del file Flash in questo:

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) { }
...

Quindi, nel JavaScript che sto usando per incorporare lì il file SWF, in primo luogo, prendo sostanzialmente il dominio corrente della pagina da document.location.toString () , controlla se è usando http o https, quindi passare il dominio come allow e / o allowhttps nel parametro flashvars. Potrebbe esserci un "migliore" modo di fare ciò che non si basa sull'impostazione esplicita del dominio in Flash Vars (una sorta di rilevamento automatico dall'interno di Flash), ma non sono abbastanza esperto in ActionScript per capirlo. E poiché questo file sta già eseguendo un sacco di comunicazione bidirezionale tra JavaScript e ActionScript, non è un grosso problema. Questa soluzione è abbastanza buona per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top