6

できるだけ具体的かつ詳細に説明し、使用しているコードの一部を含めます。私はすでに検索を行って、この質問を見つけましたが、これは似ているようです。しかし、そこの作者は 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 つの関数が定義されjsAjaxjsAjaxResponsejsAjaxReadyます。最後の 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.xmldomaintwo.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 で動作させるにはどうすればよいですか?

4

1 に答える 1

4

私はそれを理解しました!Security.allowDomain私のFlashファイルのコマンドに関係していました。私は実際test.htmlに domainone.com のサブドメインで をホストしていましたが、それがうまくいきませんでした。サブドメインなどすべてが完全に一致している必要があります。Security.allowDomainシナリオ 3では、domaintwo.com を参照するコマンドは必要なく、crossdomain.xmlファイルが存在する必要もまったくありませんでした。

私が最終的に使用するこのスクリプトの「実際の」バージョンでは、domainone.com が実際に何であるかは必ずしもわからないため、Flash ファイルの上部にあるコードを次のように変更しました。

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

次に、最初に SWF を埋め込むために使用している JavaScript で、基本的に からページの現在のドメインを取得し、document.location.toString()http または https を使用しているかどうかを確認し、ドメインを asおよびallow/またはallowhttpsflashvars パラメータ。これを行うには、Flash Vars でドメインを明示的に設定することに依存しない「より良い」方法があるかもしれません (Flash 内からのある種の自動検出)。アウト。このファイルはすでに JavaScript と ActionScript の間で大量の双方向通信を行っているため、それほど大きな問題ではありません。この解決策は私にとって十分です。

于 2009-10-28T20:16:27.127 に答える