3

次のスクリプトを使用しています-

<!DOCTYPE html>
<html>
<head>
<script src="jquery-1.9.1.min.js"></script>
<script>
function postForm() {

    $.ajax({
            type: 'POST',
            url: 'http://10.0.0.8:9000/demo',
            data: {"name" : "test"},
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
        })
    }

</script>
</head>
<body>
    <form id="ajaxForm" onsubmit="postForm(); return false; "  method="post"> 
        <input id="test" type="text" name="name" value="Hello JSON" /> 
        <input type="submit" value="Submit JSON" /> 
    </form>

</body>
</html>

アクセスしようとしているコンピューターは、play フレームワークを実行しています。次のエラーが表示されます。

OPTIONS http://10.0.0.8:9000/demo404 (見つかりません) jquery-1.9.1.min.js:5 XMLHttpRequest を読み込めませんhttp://10.0.0.8:9000/demohttp://localhost:8080Access-Control-Allow-Origin でオリジンが許可されていません。

2日間困っています、誰か助けてくれませんか?

よろしくお願いします

4

1 に答える 1

19

http://localhost:8080問題は、クロスオリジン呼び出し (からへ)を行おうとしていることですhttp://localhost:9000これはSame Origin Policyで許可されていないため、ブラウザはCross-Origin Resource Sharingを使用して、クロスオリジン呼び出しを許可してもよいかどうかをサーバーに問い合わせようとしています。(これが、表示されているOPTIONSHTTP 要求です。) サーバーはOPTIONS呼び出しを許可するヘッダーを含む要求に応答しないため、セキュリティ上の理由からブラウザーによって拒否されます。

SOP は、すべての真の「ajax」呼び出し (たとえば、 経由のものXMLHttpRequest) に適用されます。次のいずれかを実行できます。

  1. OPTIONSサーバーを更新して、ヘッダーを返すリクエストへの応答を実装し、呼び出しを許可します (これにより、ほとんどの最新のブラウザーで動作します)。

  2. 同じポートにリクエストを送信します (そうしない理由があると思います)。そのため、リクエストは同じオリジンに送信され、SOP は適用されません。または、

  3. を使用するように切り替えますJSON-P。しかし、JSON-Pそれは であるため、フォームの送信には不適切でGETあり、GET操作は冪等であることを意図していますが、ほとんどのフォームの送信はそうではありません。したがって、これが冪等のフォーム送信 (検索など) でない限り、JSON-P を使用することはせいぜいハックです。

于 2013-03-14T14:38:05.330 に答える