我将尽可能具体和详细,并包含一些我正在使用的代码。我已经进行了搜索并发现这个问题,这看起来很相似;然而,作者使用的是 ActionScript 2 而不是 3,我似乎无法有效地将给出的任何答案应用于我自己的情况。
我试图通过 Flash/ActionScript 3 模拟(以有限的方式)JavaScript 的 XMLHttpRequest 对象的行为,以克服同域限制。但我发现 ActionScript 在这方面有其自身的局限性。我承认我可能是错的,但据我了解,理论上仍然可以使用 ActionScript 进行这种跨域脚本编写,只要您获得了正确的所有权限。这就是我遇到麻烦的地方。
首先,我借用了一个名为的类的一些开源代码Ajax请求,我已另存为/ajax/AjaxRequest.as
。然后我创建了一个名为的 Flash 文件/jsajax.fla
导出到最终的 SWF 文件,/jsajax.swf
。现在,下面是包含 Flash 文件的第一个也是唯一一个帧的 ActionScript 代码:
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");
到目前为止,一切都很好。我有一种感觉,其中一个或多个Security.allowDomain
不需要打电话,但它们是我试图解决这个问题的(不成功的)尝试。
在我的 JavaScript 中,我定义了三个函数:jsAjax
, jsAjaxResponse
, and jsAjaxReady
。最后一个只是一个非常基本的函数,用于指示 Flash 对象加载成功(仅在加载后立即调用一次),而其他两个用于发送和接收数据。正如您所看到的,它们有相应的 ActionScript 对应项。
最后,我创建了一个简单的 HTML 页面,名为/test.html
嵌入此 SWF 文件(使用swf对象)并有几个简单的表单控件用于调用jsAjax
功能。我所有的 JavaScript 定义也都嵌入到这个 HTML 文件中。我还创建了一个非常简单的 PHP 脚本,名为/test.php
打印出内容$_REQUEST
大批。这就是我打算使用此 ajax 方法请求的脚本。
我测试了三种场景,但我只能让其中两种工作:
场景一:一切都在一台服务器上
如果我将所有这些文件上传到domainone.com,然后请求test.php,它就可以正常工作。我的文件/文件夹结构如下所示:
domainone.com/jsajax.swf
domainone.com/test.html
domainone.com/test.php
Again, 这有效。 jsAjaxResponse 函数很好地从 test.php 接收回数据。
场景二:在两台服务器上,向左倾斜
当我将 HTML 和 SWF 上传到第一台服务器,然后让它调用第二台服务器上的 PHP 脚本时,它并没有立即工作。我做了一些挖掘,发现通过创建crossdomain.xml
授予对domainone.com 访问权限的domaintwo.com 上的文件,这修复了它。所以我的文件/文件夹结构如下所示:
domainone.com/jsajax.swf
domainone.com/test.html
domaintwo.com/test.php
domaintwo.com/crossdomain.xml
当在 crossdomain.xml 文件中明确允许 domainone.com 时,这有效。同样,jsAjaxResponse 函数从 test.php 接收回数据就好了。
场景三:在两台服务器上,向右倾斜
当我将除 HTML 之外的所有内容上传到domaintwo.com 时,我无法再让它工作。换句话说,domainone.com 上的 HTML 正在引用 domaintwo.com 上托管的 SWF 文件,并且该 SWF 文件正在尝试向 domaintwo.com 发出请求。我保留了场景 2 中相同的 crossdomain.xml 文件,以防万一。我的文件/文件夹结构如下所示:
domainone.com/test.html
domaintwo.com/jsajax.swf
domaintwo.com/test.php
domaintwo.com/crossdomain.xml
这是我无法开始工作的唯一情况,也是我需要开始工作的情况。前两个实际上只是测试场景,看看脚本是否正常工作。当我尝试在这里运行 jsAjax 函数时,我遇到了一个错误,该错误在 Firebug 中出现了两次:
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.].
帮助!如何让它在场景 3 中工作?