できるだけ具体的かつ詳細に説明し、使用しているコードの一部を含めます。私はすでに検索を行って、この質問を見つけましたが、これは似ているようです。しかし、そこの作者は 3 ではなく ActionScript 2 を使用していたため、与えられた回答を自分の状況に効果的に適用できなかったようです。
同じドメインの制限を克服するために、Flash/ActionScript 3 を介して JavaScript の XMLHttpRequest オブジェクトの動作を (限定的な方法で) エミュレートしようとしています。しかし、ActionScript にはその点で独自の制限があることがわかりました。私が間違っている可能性があることは認めますが、私の理解では、すべての権限を適切に取得している限り、ActionScript を使用してこの種のクロスドメイン スクリプティングを実行することは理論的には可能です。そして、それが私が困っているところです。
最初に、 AjaxRequestという名前のクラスのオープン ソース コードをいくつか借りてきました。これを として保存しまし/ajax/AjaxRequest.as
た。/jsajax.fla
次に、最終的な SWF ファイルにエクスポートするという Flash ファイルを作成しました/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
これらの呼び出しの 1 つまたは複数は不要であると感じていますが、これらはこの問題を解決しようとする私の (失敗した) 試みでした。
私の JavaScript では、 、 、 の 3 つの関数が定義されjsAjax
てjsAjaxResponse
いjsAjaxReady
ます。最後の 1 つは、Flash オブジェクトが正常にロードされたことを示すために使用される非常に基本的な関数であり (1 回だけ呼び出され、ロード直後に呼び出されます)、残りの 2 つはデータの送受信に使用されます。ご覧のとおり、これらには対応する ActionScript の対応物があります。
/test.html
最後に、この SWF ファイルを埋め込み ( swfobjectを使用)という名前の単純な HTML ページを作成し、jsAjax
関数を呼び出すためのいくつかの単純なフォーム コントロールを用意しました。私の JavaScript 定義もすべてこの HTML ファイルに埋め込まれています。また、配列/test.php
の内容を出力する、という非常に単純な PHP スクリプトも作成しました。$_REQUEST
これが、この ajax メソッドを使用してリクエストするスクリプトです。
テストしたシナリオは 3 つありますが、そのうちの 2 つしか機能しませんでした。
シナリオ 1: すべて 1 つのサーバー上
これらのファイルをすべて domainone.com にアップロードし、test.php を要求すると、問題なく動作します。私のファイル/フォルダー構造は次のようになります。
domainone.com/jsajax.swf
domainone.com/test.html
domainone.com/test.php
繰り返しますが、これは機能します。jsAjaxResponse 関数は、test.php からデータを正常に受け取ります。
シナリオ 2: 両方のサーバーで左に傾く
HTML と SWF を最初のサーバーにアップロードし、2 番目のサーバーで PHP スクリプトを呼び出すだけでは、すぐには機能しませんでした。掘り下げてみたところ、crossdomain.xml
domaintwo.com に domainone.com へのアクセスを許可するファイルを作成することで、問題が解決したことがわかりました。したがって、私のファイル/フォルダー構造は次のようになります。
domainone.com/jsajax.swf
domainone.com/test.html
domaintwo.com/test.php
domaintwo.com/crossdomain.xml
crossdomain.xml ファイルで domainone.com を明示的に許可すると、これが機能します。ここでも、jsAjaxResponse 関数は test.php からデータを正常に受け取ります。
シナリオ 3: 両方のサーバーで右に傾いて
いる 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
これは私が仕事をすることができなかった唯一のケースであり、これは私が仕事をする必要があるケースです. 最初の 2 つは、スクリプトが実際に機能しているかどうかを確認するための単なるテスト シナリオでした。ここで jsAjax 関数を実行しようとすると、Firebug で 2 回表示されるエラーが発生します。
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 で動作させるにはどうすればよいですか?