Frage

Ich werde als spezifische und ausführliche wie möglich sein und ein Teil des Codes umfassen ich verwende. Ich habe bereits eine Suche und fand diese Frage , das scheint ähnlich; aber der Autor war es mit Actionscript 2 statt 3, und ich konnte nicht effektiv zu meiner eigenen Situation gegeben eine der Antworten zu gelten scheinen.

Ich versuche, (in begrenztem Umfang) das Verhalten von JavaScript XMLHttpRequest-Objekt durch Flash / Actionscript 3, um zu emulieren die gleichen Bereichsbegrenzung zu überwinden. Aber ich entdeckte, dass Actionscript seine eigenen Grenzen in dieser Hinsicht hat. Ich gebe zu, dass ich verwechselt werden könnte, aber von dem, was ich verstehe es theoretisch noch möglich ist, diese Art von Cross-Domain-Scripting zu tun mit Actionscript, so lange, wie Sie alle Berechtigungen richtig. Und das ist, wo ich in Schwierigkeiten bin ausgeführt wird.

Zuerst habe ich entlehnt einige Open-Source-Code für eine Klasse namens AjaxRequest , die ich als /ajax/AjaxRequest.as gespeichert haben. Ich habe dann eine Flash-Datei namens /jsajax.fla, die auf die endgültige SWF-Datei, /jsajax.swf exportiert. Nun, hier ist der Actionscript-Code, den den ersten und einzigen Rahmen der Flash-Datei enthält:

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

So weit, so gut. Ich habe das Gefühl, dass ein oder mehr diese Security.allowDomain Anrufe werden nicht benötigt, aber sie waren mein (erfolglos) versucht, um zu versuchen, dieses Problem zu lösen.

In meinem JavaScript, ich habe drei Funktionen bekommt definiert: jsAjax, jsAjaxResponse und jsAjaxReady. Der letzte ist nur eine sehr einfache Funktion verwendet, um anzuzeigen, dass das Objekt-Flash erfolgreich geladen (die nur einmal und sofort aufgerufen es beim Laden), während die beiden anderen für das Senden und Empfangen der Daten verwendet werden. Wie Sie sehen können, haben sie entsprechende Actionscript-Pendants.

Schließlich habe ich eine einfache HTML-Seite namens /test.html, der diese SWF-Datei einbettet (mit swfobject ) und hat ein paar einfachen Formular-Steuerelemente für die jsAjax Funktion aufrufen. Alle meine JavaScript-Definitionen werden auch in dieser HTML-Datei eingebettet. Ich habe auch ein sehr einfaches PHP-Skript namens /test.php, die den Inhalt des $_REQUEST Array ausdruckt. Das ist das Skript Ich beabsichtige mit diesem Ajax-Verfahren zu beantragen.

Es gibt drei Szenarien, die ich getestet, aber ich konnte nur zwei von ihnen zum Laufen bringen:


SZENARIO ONE: Alle auf einem Server
Wenn ich alle diese Dateien auf domainone.com laden, und dann test.php verlangen, es funktioniert gut. Meine Datei / Ordner-Struktur sieht dann wie folgt aus:

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

Auch hier das funktioniert . Die jsAjaxResponse Funktion die Daten aus test.php zurückerhält gut.


SZENARIO TWO: Auf beiden Servern, stützte sich links
Wenn ich die HTML und SWF zum ersten Server hochgeladen, und dann haben sie nur auf dem zweiten Server das PHP-Skript aufrufen, es sofort nicht funktionierte. Ich habe einige graben, und festgestellt, dass durch eine crossdomain.xml Datei auf domaintwo.com erstellen, die den Zugriff auf domainone.com gewährt, das es fest. So ist meine Datei / Ordner-Struktur sah wie folgt aus:

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

Wenn explizit erlaubt domainone.com in der crossdomain.xml-Datei das funktioniert . Auch die Daten von test.php empfängt wieder die jsAjaxResponse Funktion nur in Ordnung.


SZENARIO DREI: Auf beiden Servern, stützte sich rechts
Wenn ich alle, aber die HTML domaintwo.com hochgeladen, konnte ich nicht mehr bekommen sie zu arbeiten. Mit anderen Worten wird der HTML-Code auf domainone.com Referenzierung eine SWF-Datei auf domaintwo.com gehostet wird, und dass SWF-Datei versucht,eine Anfrage an domaintwo.com zu machen. Ich verließ die gleiche Datei crossdomain.xml von Szenario 2, nur für den Fall. Meine Datei / Ordner-Struktur sah wie folgt aus:

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

Dies ist der einzige Fall konnte ich nicht bekommen zu arbeiten, und dies ist der Fall, dass ich Arbeit bekommen müssen. Die ersten beide wurden wirklich nur Szenarien testen, um zu sehen, ob das Skript überhaupt funktioniert. Wenn ich versuche, hier meine jsAjax Funktion auszuführen, winden ich mit einem Fehler auf, die zweimal in Firebug zeigt sich:

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.].

Hilfe! Wie bekomme ich es in Szenario 3 arbeiten?

War es hilfreich?

Lösung

Habe ich es einfach aus! Es hat mit den Security.allowDomain Befehlen in meiner Flash-Datei zu tun. Ich war Hosting tatsächlich die test.html auf einer Sub-Domain von domainone.com, und das wirft ihn ab. Es hat eine genaue Übereinstimmung, Sub-Domain und alle sein. Es stellt sich heraus, dass ich nicht den Security.allowDomain Befehl benötigen, die domaintwo.com verwiesen, noch hatte ich brauche die crossdomain.xml Datei überhaupt für Szenario 3 vorhanden sein!

Da in der „realen“ Version dieses Skripts, das ich am Ende mit, werde ich nicht unbedingt wissen, was domainone.com tatsächlich ist, ich den Code auf der Oberseite der Flash-Datei dies geändert:

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

Dann wird in der JavaScript Ich bin mit dem SWF es in erster Linie einzubetten, ich im Grunde die aktuelle Domäne der Seite von document.location.toString() greifen, zu überprüfen, ob es http oder https ist verwenden und dann die Domain in als allow passieren und / oder in den allowhttps flashvars Parametern. Es könnte eine „bessere“ Art und Weise, dies zu tun, die nicht auf sich angewiesen, um die Domain-up explizit im Flash Vars (eine Art automatischer Erkennung von Flash) einstellen, aber ich bin nicht in Actionscript gut genug, um Abbildung versiert, dass aus. Und da diese Datei bereits eine ganze Reihe von bidirektionale Kommunikation zwischen JavaScript und Actionscript zu tun, ist es nicht so große Sache. Diese Lösung ist gut genug für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top