0

dojoでログイン機能を書こうとしています。私の場合、この場合、extern (!!) サーバーへのポスト リクエストが必要です。

ログインは次のように定義されます。

ログインする

ログインは特別なアクションであり、データを処理するのではなく、ユーザーを認証します。キー 'email' と 'password' を持つ json オブジェクトを含む POST 要求が行われます。戻り値は true または false です。さらに識別するために、特別な Cookie が返されます。

有効な API 呼び出し

URL: /api/ログイン

方法: ポスト

田畑:

Eメール

パスワード

説明:ログインしているユーザーのすべてのデータを PLIST 形式で返します。ログインに失敗した場合は、PLIST 形式で false が返されます。

さて、私は io.iframe.send 呼び出しでその問題を解決しようとしましたが、次のエラーが表示されます: エラー: プロパティ 'getElementsByTagName' にアクセスする権限が拒否されました

ただし、 io.iframe が私の問題を解決する正しい方法であるかどうかはわかりません。

おそらくあなたは私を助けることができますどうもありがとう

PS: 現在のコードは次のようになります。

function login(){
    require(["dojo/io/iframe", "dojo/dom"], function(iframe, dom){
        var email = dom.byId("logEmail").value;
        var password = dom.byId("logPassword").value;

        function JSONreq(){

            var jsonpArgs = {
                method: 'POST',
                handleAs:"json",
                content:{
                    email: email,
                    password: password

                },
                url: "http://---someServerThatIDontWantToName---/api2/login",
                load: function (response, ioargs){
                    //console.log(response)
                    alert('succes');
                },
                error: function(response, ioargs){
                    alert("error");
                }
            };
            iframe.send(jsonpArgs);
        }
        dojo.ready(JSONreq);

    });
};

モバイル開発に違いはありますか?クロスサーバー ポスト リクエストは、モバイル デバイスで可能にする必要があります。

そう: この理由で io.iframe.send を使用できますか?

4

2 に答える 2

1

ターゲットiframeを使用してPOSTリクエストを別のドメインに送信できますが、そのiframeからプロパティまたはDOMノードを読み取ることはできません。

ありますがXHR2、すべてのブラウザでサポートされているわけではなく、サーバーは特定のヘッダーを返す必要があります。XHR2経由でPOSTを送信できるかどうかはわかりません。

于 2012-04-04T14:02:04.293 に答える
0

つまり、Anser は、ブラウザ クライアントを介して X ドメインで POST リクエストをいつでも使用することはできません。理由は、DOM が別の名前空間で保護されており、io.iframe を介して何が起こっているかです。

  1. GET リクエストを確立する
  2. フォームを検索し、(リモート) 入力が存在する場合は foreach (ローカル) の名前/値のコンテンツ キーペアをチェックします
    • 存在しない場合は、次のように作成します。dojo.create("input", {type: "hidden", name: name, value: value}, fn);
    • そうでない場合は、form.element-of-name に値を設定します。

そのため、最初に 2) で DOM ルックアップが失敗します。これはセキュリティ上の制限が原因で、「存在しない」ことを意味します。次に、2.1) dojo.create が同じ理由で失敗します。

典型的な回避策は次のとおりです。

  1. x-domainserver/api/login で GET メソッドを開きます (URL を設定: プレフィックス + dojo.formToQuery(form)
  2. ポーリング間隔で URL が更新される を作成し、ログインをキープアライブにします
  3. サーバー側が x-domainserver/api/login に POST を実行し、結果を返す同じホストサーバー/api/login/passthrough に「jumphost」を作成します。このためのPHPソリューションを提供する

    $allowedDomains = array( "http://facebook.whatever.org/", "http://yournavigation.org/");

    // x-ドメインのターゲット リクエスト uri、たとえば "フォーム アクション" $action = $_REQUEST["url"];

    // メソッドは POST のみを検索し、デフォルト GET $method = $_REQUEST["method"];

    // _REQUEST をロールスルーすることで埋められたクエリ プレースホルダーは、メソッドと URL のペアを除くすべてを追加します $fields = "";

    // allowedDomains に対して承認するか、死ぬ

    foreach ($allowedDomains as $domain) {

    if (strpos(substr($action, 0, strlen($domain)), $domain) !== false) {
    header("HTTP/1.0 403 Forbidden");
    die("Domain name "".$action."" not allowed. Access denied.");
    flush();
    }
    

    }

    if (count($_REQUEST) > 2) {

    foreach ($_REQUEST as $key => $value) {
    
        if ($key != "url" && $key != "method") // append anything but url and method
            $fields .= $key . "=" . rawurlencode($value) . "&";
    }
    

    $fields = substr($fields, 0, strlen($fields) - 1);

    // curl のセットアップ $ch = curl_init(); if (strtoupper($method) == "POST") { curl_setopt($ch, CURLOPT_URL, $action); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); } else { curl_setopt($ch, CURLOPT_URL, $action . "?" . $fields);
    } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_USERAGENT, "transport.php (CURL)");

    // 送信し、返された応答をキャッチして閉じます $response = curl_exec($ch); $info = curl_getinfo($ch); curl_close($ch);

    // クライアント XHR への返信応答 header("Content-type: ".$info["content_type"]); $応答をエコーし​​ます。

于 2012-04-29T02:01:48.673 に答える