Pregunta

Seré lo más específico y detallado posible e incluiré parte del código que estoy usando. Ya hice una búsqueda y encontré esta pregunta , que parece similar; sin embargo, el autor allí estaba usando ActionScript 2 en lugar de 3, y parecía que no podía aplicar ninguna de las respuestas dadas a mi propia situación de manera efectiva.

Estoy tratando de emular (de forma limitada) el comportamiento del objeto XMLHttpRequest de JavaScript a través de Flash / ActionScript 3, para superar la limitación del mismo dominio. Pero estoy descubriendo que ActionScript tiene sus propias limitaciones en ese sentido. Admito que podría estar equivocado, pero por lo que entiendo, en teoría, todavía es posible hacer este tipo de secuencias de comandos de dominio cruzado utilizando ActionScript, siempre y cuando obtenga todos los permisos correctos. Y ahí es donde me encuentro con problemas.

Primero, tomé prestado un código de código abierto para una clase llamada AjaxRequest , que he guardado como /ajax/AjaxRequest.as . Luego creé un archivo Flash llamado /jsajax.fla que exporta al archivo SWF final, /jsajax.swf . Ahora, aquí está el código ActionScript que comprende el primer y único marco del archivo 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");

Hasta ahora todo bien. Tengo la sensación de que una o más de esas llamadas Security.allowDomain no son necesarias, pero fueron mis intentos (fallidos) de intentar resolver este problema.

En mi JavaScript, tengo tres funciones definidas: jsAjax , jsAjaxResponse y jsAjaxReady . La última es solo una función muy básica utilizada para indicar que el objeto Flash se cargó correctamente (que solo se llama una vez e inmediatamente después de cargarlo), mientras que las otras dos se utilizan para enviar y recibir los datos. Como puede ver, tienen sus equivalentes de ActionScript correspondientes.

Finalmente, creé una página HTML simple llamada /test.html que incorpora este archivo SWF (usando swfobject ) y tiene un par de controles de forma simples para llamar a la función jsAjax . Todas mis definiciones de JavaScript están integradas en este archivo HTML también. También creé un script PHP muy simple llamado /test.php que imprime el contenido de la matriz $ _REQUEST . Ese es el script que pretendo solicitar usando este método ajax.

Hay tres escenarios que probé, pero solo pude hacer que funcionaran dos:


ESCENARIO UNO: Todo en un servidor
Si subo todos estos archivos a domainone.com, y luego solicito test.php, funciona bien. La estructura de mi archivo / carpeta se ve así:

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

Nuevamente, esto funciona . La función jsAjaxResponse recibe los datos de test.php muy bien.


ESCENARIO DOS: en ambos servidores, inclinándose hacia la izquierda
Cuando cargué el HTML y SWF en el primer servidor, y luego solo hice que llamara al script PHP en el segundo servidor, no funcionó de inmediato. Investigué un poco y descubrí que al crear un archivo crossdomain.xml en domaintwo.com que otorgaba acceso a domainone.com, esto lo solucionó. Entonces mi estructura de archivo / carpeta se veía así:

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

Al permitir explícitamente domainone.com en el archivo crossdomain.xml, esto funciona . Nuevamente, la función jsAjaxResponse recibe los datos de test.php muy bien.


ESCENARIO TRES: en ambos servidores, inclinándose hacia la derecha
Cuando cargué todo menos el HTML en domaintwo.com, ya no pude hacerlo funcionar. En otras palabras, el HTML en domainone.com hace referencia a un archivo SWF alojado en domaintwo.com, un

¿Fue útil?

Solución

¡Lo acabo de descubrir! Tenía que ver con los comandos Security.allowDomain en mi archivo Flash. En realidad estaba alojando el test.html en un subdominio de domainone.com, y eso fue descartarlo. Tiene que ser una coincidencia exacta, subdominio y todo. Resulta que no necesitaba el comando Security.allowDomain que hacía referencia a domaintwo.com, ni necesitaba el archivo crossdomain.xml para estar presente para el escenario 3 !

Dado que en el " real " versión de este script que termino usando, no necesariamente sabré qué es domainone.com en realidad, cambié el código en la parte superior del archivo Flash a esto:

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

Luego, en el JavaScript que estoy usando para incrustar el SWF allí en primer lugar, básicamente tomo el dominio actual de la página desde document.location.toString () , verifica si es usando http o https, y luego pase el dominio como allow y / o allowhttps en el parámetro flashvars. Puede haber un " mejor " Una forma de hacer esto que no se basa en configurar el dominio explícitamente en los Flash Vars (algún tipo de detección automática desde Flash), pero no estoy lo suficientemente versado en ActionScript como para entenderlo. Y dado que este archivo ya está haciendo una gran cantidad de comunicación bidireccional entre JavaScript y ActionScript, no es tan importante. Esta solución es lo suficientemente buena para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top