ここで「アクセス制御 - アローオリジンによってオリジンは許可されていない」と表示されているのはなぜですか? [複製

StackOverflow https://stackoverflow.com/questions/9310112

質問

この質問にはすでに答えがあります:

次のエラーが表示されます。

Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin

このコードで:

var http = new getXMLHttpRequestObject();
var url = "http://gdata.youtube.com/action/GetUploadToken";
var sendXML = '<?xml version="1.0"?><entry xmlns="http://www.w3.org/2005/Atom"'+
    'xmlns:media="http://search.yahoo.com/mrss/'+
    'xmlns:yt="http://gdata.youtube.com/schemas/2007">'+
    '<media:group><media:title type="plain">My First API</media:title>'+
    '<media:description type="plain">First API</media:description>'+
    '<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>'+
    '<media:keywords>first, api</media:keywords></media:group></entry>';
http.open("POST", url, true);
http.setRequestHeader("Authorization", "AuthSub token=" + AccessToken);
http.setRequestHeader("X-GData-Key", "key="+ dev_key);
http.setRequestHeader("Content-Type", "application/atom+xml; charset=UTF-8");

http.onreadystatechange = function() {
    if(http.readyState == 4) {
        alert(http.responseXML);
    }
}
http.send(sendXML);

何がこれを引き起こす可能性があり、どうすればそれを解決できますか?

役に立ちましたか?

解決

JavaScriptは、現在のドメイン以外でAJAX要求を行うときに制限されています。

  • Ex 1:ドメインはexample.comであり、test.com =>にリクエストを行いたいと思います。
  • Ex 2:ドメインはexample.comであり、inner.example.comにリクエストを行いたいと思います。
  • Ex 3:あなたのドメインはexample.com:80であり、あなたはexample.com:81 =>にリクエストをしたいです
  • Ex 4:ドメインはexample.comであり、example.com =>にリクエストを行いたいと思います。

JavaScriptは、セキュリティ上の理由で「同じオリジンポリシー」によって制限されているため、悪意のあるスクリプトはリモートサーバーに連絡して機密データを送信できません。

jsonp JavaScriptを使用する別の方法です。リクエストを行い、結果はクライアントで実行されるコールバック関数にカプセル化されます。これは、新しいスクリプトタグをHTMLのヘッド部分にリンクすることと同じです(ここでは、異なるドメインからスクリプトをロードできることがわかります)。
ただし、JSONPを使用するには、サーバーを適切に構成する必要があります。これがそうでない場合は、JSONPを使用することができず、サーバー側のプロキシ(PHP、ASPなど)に依存する必要があります。このトピックに関連するガイドがたくさんあります。

他のヒント

xmlhttprequestはあなたに到達できません localhost:8080 「同じ起源ポリシー」のため。

あなたはあなたの応答にヘッダーを追加することにより、最新のブラウザからのリクエストを許可できます localhost:8080:

Access-Control-Allow-Origin: *

HTTPサーバーにディレクティブを追加するか、サーバーサイドコード(PHP、Ruby、...)を介してヘッダーを追加することで、これを行うことができます。

クロスオリジンAjaxリクエストの詳細を読んでください https://developer.mozilla.org/en/http_access_control

Chromeを使用している場合、単純な回避策(開発目的のみ)を使用することです。 --disable-web-security.

ソリューションにglobal.asaxを追加します。

追加

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

protected void Application_BeginRequest(object sender, EventArgs e)
{
}

Apacheを使用している場合、これは機能します。これをパブリックルートに.htaccessファイルを作成/作成し、必要な他のファイル拡張子を追加します。

<FilesMatch "\.(ttf|otf|eot|woff|jpg|png|jpeg|gif|js|json|html|css)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

ローカル開発には、HTTP応答ヘッダーを変更するためのツールを使用できます。例えば チャールズ 付属の書き換えツールによってこれを行うことができます: ツールを書き直します

ターゲットドメイン/場所に新しいルールを追加するだけです。

Type: Add Header
Where: Response
Replace
     Name: Access-Control-Allow-Origin
     Value: *
Replace All

ここでは、apache httpのために2つのことをする必要があります

1)httpd.configファイルで、このファイルを外します

LoadModule headers_module modules/mod_headers.so

2)この線を下に追加します。

Header set Access-Control-Allow-Origin "*"

Google Chromeをブラウザとして使用すると、CORS拡張機能を追加してアクティブ化できます。コードに何も変更せずにホールの問題を解決します

この特定の質問とは関係ありませんが、jQueryを使用しているこの状況の誰にとっても...このエラーは、jQueryを使用してJSONPリクエストを作成し、マジックコールバックパラメーターを省略しようとする場合にも発生します。 callback=?

Javaのバックグラウンドから来ている場合、1つの可能なソリューションは、JavaScriptのWebサービスを呼び出すサーブレットを作成することです。 Get(Your-Choice)メソッドの以下のコードのようなもの...

JsonElement jelement;
    JsonArray jarray;
    try {
        URL url = new URL("http://rest."YOUR URL"#ba0482");
        URLConnection connection = url.openConnection();
        connection.setDoInput(true);
        InputStream inStream = connection.getInputStream();
        BufferedReader input = new BufferedReader(new InputStreamReader(inStream));

        jelement = new JsonParser().parse(input);

        jarray = jelement.getAsJsonArray();

        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        out.print(jarray);
        out.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

JavaScriptで、Servlet名としてURLを指定するだけです!!

AJAXを使用してPHPページにアクセスすると、同じエラーメッセージが表示されます(JavaScriptとPHPファイルはどちらも同じサーバーにあります)。

その理由は、JavaScriptのドメインとしてIPアドレスを指定したためです。これにより、ブラウザはPHPファイルへの呼び出しが別のサーバー上にあると信じさせられました。

したがって、このエラーメッセージを取り除くための簡単なソリューション。 a)JavaScriptとPHPファイルが同じサーバー上にあることを確認b)JavaScriptのURL(特にドメイン)を確認してください(例: http://www.smartana.co.uk/myjavascript.js)AjaxはサーバーURLを反映しています(例: http://www.smartana.co.uk/myserver.php).

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top