ここで「アクセス制御 - アローオリジンによってオリジンは許可されていない」と表示されているのはなぜですか? [複製
-
26-10-2019 - |
質問
この質問にはすでに答えがあります:
次のエラーが表示されます。
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).