web-dev-qa-db-ja.com

Origin <Origin>はAccess-Control-Allow-Originによって許可されていません

XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin. 

クロスドメインAjaxリクエストについて読み、根本的なセキュリティー問題を理解しました。私の場合は、2台のサーバーがローカルで実行されていて、テスト中にクロスドメインリクエストを有効にします。

localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server

私のページがノードサーバーからロードされている間にlocalhost:8080 - GAE serverへのajaxリクエストを発行しています。最も簡単で安全なものは何ですか(disable-web-securityオプションでchromeを起動したくない)。 'Content-Type'を変更する必要がある場合は、ノードサーバーで変更する必要がありますか?どうやって?

135
bsr

それらは異なるポート上で動作しているので、それらは異なるJavaScript Originです。それらが同じmachine/hostname上にあることは関係ありません。

サーバー上でCORSを有効にする必要があります(localhost:8080)。このサイトをチェックしてください。 http://enable-cors.org/

あなたがする必要があるのはサーバーにHTTPヘッダーを追加することだけです:

Access-Control-Allow-Origin: http://localhost:3000

または、簡単にするために:

Access-Control-Allow-Origin: *
147
Rocket Hazmat

AjaxリクエストについてChromeで素早い回避策が必要な場合は、このクロムプラグインを使用すると、適切なレスポンスヘッダーを追加することで、あらゆるソースからあらゆるサイトに自動的にアクセスできます。

Chrome拡張機能Allow-Control-Allow-Origin:*

52
Billy Baker

これを解決するにはCORSを有効にする必要があります。

アプリが単純なnode.jsで作成されている場合

以下のようにレスポンスヘッダに設定してください。

var http = require('http');

http.createServer(function (request, response) {
response.writeHead(200, {
    'Content-Type': 'text/plain',
    'Access-Control-Allow-Origin' : '*',
    'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE'
});
response.end('Hello World\n');
}).listen(3000);

アプリがエクスプレスフレームワークで作成されている場合

のようなCORSミドルウェアを使う

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
}

と経由で適用

app.configure(function() {
    app.use(allowCrossDomain);
    //some other code
});    

これは2つの参照リンクです

  1. エクスプレスノードの許可方法
  2. ノードへのダイビング - js - 一番最初のアプリ #see Ajaxセクション
43
mithunsatheesh

私はそれを解決策に導いてくれるので@Rocket hazmatの答えを受け入れます。それは確かに私がヘッダを設定する必要があるGAEサーバ上にありました。私はこれらを設定しなければなりませんでした

"Access-Control-Allow-Origin" -> "*"
"Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"

"Access-Control-Allow-Origin"のみを設定するとエラーが発生した

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.

認証トークンを送信する必要がある場合も、これを追加してください

"Access-Control-Allow-Credentials" -> "true"

また、クライアント側でwithCredentialsを設定してください。

これにより、2つの要求がサーバーに送信されます。1つはOPTIONSです。認証クッキーは一緒に送信されないため、外部認証を扱う必要があります。

7
bsr

あなたがエクスプレスを使用している場合は、次のようにCorsミドルウェアを使用することができます。

var express = require('express')
var cors = require('cors')
var app = express()

app.use(cors())

Chromeからajaxを使ってクロスオリジンリソースを呼び出す際に問題が発生していました。

私は自分のnode jsアプリをデプロイするためにnode jsとローカルhttpサーバーを使いました。

クロスオリジンリソースにアクセスすると、エラーが発生しました。

私はそれについて一つの解決策を見つけました、

1)app.jsファイルに以下のコードを追加しました

res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");

2)クロスオリジンリソースと呼ばれる私のhtmlページで$.getJSON();を使います

$.getJSON("http://localhost:3000/users", function (data) {
    alert("*******Success*********");
    var response=JSON.stringify(data);
    alert("success="+response);
    document.getElementById("employeeDetails").value=response;
});
3
Chaitanya
In router.js just add code before calling get/post methods. It works for me without errors.

//Importing modules @Brahmmeswar
const express = require('express');
const router = express.Router();

const Contact = require('../models/contacts');

router.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
  });

その後403になったら、WEB.XML Tomcat configのフィルタを次のように減らしてください。

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.Apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
</filter>
2
Farbod Aprin

インポートの下でこれをあなたのNodeJSサーバーに追加してください:

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
1
Ryan Cocuzzo

私はついにApache Tomcat8の答えを得ました

Tomcatのweb.xmlファイルを編集する必要があります。

おそらくそれはwebappsフォルダの中にあるでしょう、

Sudo gedit /opt/Tomcat/webapps/your_directory/WEB-INF/web.xml

見つけて編集する

<web-app>


<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.Apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>


<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>



</web-app>

これにより、Access-Control-Allow-Originすべてのホストが許可されます。すべてのホストから自分のホストだけに変更する必要がある場合は、

<param-name>cors.allowed.origins</param-name>
<param-value>http://localhost:3000</param-value>

*からあなたの http:// your_public_IP または http://www.example.com までのコード

ここで参照できます Tomcatフィルタのドキュメント

ありがとう

1
Shinto Joseph

dataType: 'jsonp'を使ってください。

   async function get_ajax_data(){

       var _reprojected_lat_lng = await $.ajax({

                                type: 'GET',

                                dataType: 'jsonp',

                                data: {},

                                url: _reprojection_url,

                                error: function (jqXHR, textStatus, errorThrown) {

                                    console.log(jqXHR)

                                },

                                success: function (data) {

                                    console.log(data);



                                    // note: data is already json type, you just specify dataType: jsonp

                                    return data;

                                }

                            });





 } // function               
0
hoogw

PHPの場合、これを使用してヘッダーを設定します。

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
0
Hamza Waleed