Origin <origin> ist von Access-Control-Allow-Origin nicht zulässig

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

Ich habe über domänenübergreifende Ajax-Anfragen gelesen und verstehe das zugrunde liegende Sicherheitsproblem. In meinem Fall werden 2 Server lokal ausgeführt und möchten domänenübergreifende Anforderungen während des Testens aktivieren.

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

Ich stelle eine Ajax-Anfrage an, localhost:8080 - GAE serverwährend meine Seite vom Knotenserver geladen wird. Was ist das einfachste und sicherste (Sie möchten Chrome nicht mit der disable-web-securityOption starten ). Wenn ich mich ändern muss 'Content-Type', sollte ich es auf dem Knotenserver tun? Wie?

bsr
quelle
Eine schnellere Lösung finden Sie hier: stackoverflow.com/a/21622564/4455570
Gabriel Wamunyu

Antworten:

192

Da sie auf verschiedenen Ports ausgeführt werden, handelt es sich um unterschiedliches JavaScript origin. Es spielt keine Rolle, dass sie sich auf demselben Computer / Hostnamen befinden.

Sie müssen CORS auf dem Server aktivieren (localhost: 8080). Schauen Sie sich diese Seite an: http://enable-cors.org/

Sie müssen dem Server lediglich einen HTTP-Header hinzufügen:

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

Oder der Einfachheit halber:

Access-Control-Allow-Origin: *

Denken Sie, verwenden Sie nicht "*", wenn Ihr Server versucht, ein Cookie zu setzen, und Sie verwenden withCredentials = true

Bei der Beantwortung einer Anfrage mit Anmeldeinformationen muss der Server eine Domäne angeben und kann kein Platzhalterzeichen verwenden.

Sie können mehr über lesen withCredentialshier

Rakete Hazmat
quelle
Wenn wir diesen Header in einen HTML-Code einfügen möchten, was sollen wir dann dafür tun?
Azam Alvi
1
Ich dachte nicht, dass dieser Port notwendig ist, aber wenn Sie einen nicht standardmäßigen Port wie 3000 verwenden, müssen Sie ihn in die CORS-Richtlinie aufnehmen.
Michael Connor
4
Danke für diese Antwort. Ich möchte hier nur die Sicherheitsauswirkungen der Verwendung von '*' als Wert hervorheben. Dies ermöglicht alle Ursprünge: developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… Das erste Beispiel scheint im Hinblick auf den geringsten Zugriff am besten zu sein. Details dazu finden Sie hier mit mehreren Domains: stackoverflow.com/a/1850482/1566623
Christopher Kuttruff
14
Wenn aus Gründen der Klarheit gesagt wird, dass Sie "einen HTTP-Header zum Server hinzufügen" müssen, bedeutet dies, dass der angegebene Access-Control-Allow-OriginHeader ein zusätzlicher Header zu den vom Server gesendeten HTTP-Antworten sein muss. Dieser Header muss Teil der Antwort des Servers sein, er muss nicht Teil der Clientanforderung sein . Insbesondere passiert, bevor der Client die gewünschte Anfrage stellt, der Browser eine OPTIONSAnfrage vor sich sendet und wenn die Antwort des Servers auf diese OPTIONSAnfrage nicht den Header enthält, sendet der Browser Ihre gewünschte Anfrage nicht.
AjaxLeung
1
Es ist wichtig, die relevanten Tipps für Ihre Backend-Server unter enable-cors.org zu lesen.
Karlth
69

Wenn Sie für Ajax-Anfragen eine schnelle Lösung in Chrome benötigen, können Sie mit diesem Chrome-Plugin automatisch von jeder Quelle aus auf jede Site zugreifen, indem Sie den richtigen Antwortheader hinzufügen

Chrome-Erweiterung Allow-Control-Allow-Origin: *

Billy Baker
quelle
6
Ich weiß nicht, warum Sie nicht mehr positive Stimmen bekommen. Dies ist für die Entwicklung auf localhost mit Chrome am wenigsten aufdringlich.
David Betz
stimme definitiv zu. Einfache Aktivierung für localhost dev für einen Remote-Server, ohne dass die Konfiguration für den Remote-Server geändert werden muss.
Jens Wegar
@ DavidBetz: wenn man bedenkt, dass man die Erweiterung überprüft und ihr natürlich vertraut;)
Haylem
2
Dies sollte die beste Antwort sein! Besonders wenn es um localhost geht.
Herr Benedict
16
Wenn dies eine gute Lösung wäre, wäre CORS überhaupt nicht erfunden worden. Wenn Sie diesen Header auf einen beliebigen Host anwenden, wird der CORS-Schutz deaktiviert, und Sie sind schädlichen Skripten ausgesetzt, nicht nur Ihren. Seien Sie nicht überrascht, wenn Ihr Bankkonto plötzlich leer ist.
Dolmen
54

Sie müssen CORS aktivieren, um dies zu lösen

wenn Ihre App mit einfachen node.js erstellt wurde

Stellen Sie es in Ihren Antwortheadern wie ein

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);

wenn Ihre App mit Express-Framework erstellt wurde

Verwenden Sie eine CORS-Middleware wie

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();
}

und bewerben Sie sich über

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

Hier sind zwei Referenzlinks

  1. wie-man-cors-in-express-nodejs zulässt
  2. Eintauchen in den Knoten js-allererste-App #Siehe den Abschnitt Ajax
mithunsatheesh
quelle
können Sie bitte angeben, wie zu verwenden config.allowedDomains. Sag in meinem Fall, welche Uri soll ich dort setzen?
BSR
@bsr: Sie können verwenden *oder die specific domainSie Zugriff gewähren möchten.
Mithunsatheesh
1
Also bin ich der einzige, der bekommt, app.configure()ist kein Funktionsfehler?
Pramesh Bajracharya
@PrameshBajrachaya Ich habe den Teil "app.configure" nicht eingefügt - nur "app.use (allowCrossDomain)", und es hat bei mir funktioniert.
Giorgos Sfikas
8

Ich akzeptiere die Antwort von @Rocket Hazmat, da sie mich zur Lösung führt. Es war in der Tat auf dem GAE-Server, den ich brauchte, um den Header zu setzen. Ich musste diese einstellen

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

Einstellung "Access-Control-Allow-Origin" gab nur Fehler

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

Wenn ein Authentifizierungstoken gesendet werden muss, fügen Sie dies ebenfalls hinzu

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

Auch beim Kunden einstellen withCredentials

Dadurch werden 2 Anforderungen an den Server gesendet, eine mit OPTIONS. Auth-Cookie wird nicht mitgesendet, daher muss außerhalb von auth behandelt werden.

bsr
quelle
7

Fügen Sie in router.js einfach Code hinzu, bevor Sie get / post-Methoden aufrufen. Es funktioniert bei mir ohne Fehler.

//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();
  });
Brahmmeswara Rao Palepu
quelle
5

Ich hatte ein Problem beim Aufrufen einer Cross-Origin-Ressource mit Ajax aus Chrome.

Ich habe Node JS und den lokalen HTTP-Server verwendet, um meine Node JS-App bereitzustellen.

Ich habe eine Fehlerantwort erhalten, als ich auf eine Cross-Origin-Ressource zugegriffen habe

Ich habe eine Lösung dafür gefunden,

1) Ich habe meiner app.js-Datei folgenden Code hinzugefügt

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

2) In meiner HTML-Seite namens Cross-Origin-Ressource mit $.getJSON();

$.getJSON("http://localhost:3000/users", function (data) {
    alert("*******Success*********");
    var response=JSON.stringify(data);
    alert("success="+response);
    document.getElementById("employeeDetails").value=response;
});
Chaitanya
quelle
5

Wenn Sie Express verwenden, können Sie die cors-Middleware wie folgt verwenden:

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

app.use(cors())
Akalanka Weerasooriya
quelle
3

Fügen Sie dies Ihrem NodeJS-Server unter den folgenden Importen hinzu:

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();
});
Ryan Cocuzzo
quelle
3

Wenn Sie danach 403 erhalten haben, reduzieren Sie bitte die Filter in der WEB.XML-Tomcat-Konfiguration auf Folgendes:

<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>
Farbod Aprin
quelle
2

Ich habe endlich die Antwort für Apache Tomcat8 bekommen

Sie müssen die Datei tomcat web.xml bearbeiten.

wahrscheinlich wird es im webapps Ordner sein,

sudo gedit /opt/tomcat/webapps/your_directory/WEB-INF/web.xml

finde es und bearbeite es

<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>

Dies ermöglicht Access-Control-Allow-Origin allen Hosts. Wenn Sie es von allen Hosts auf nur Ihren Host ändern müssen, können Sie das bearbeiten

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

obiger Code von * zu Ihrem http: // your_public_IP oder http://www.example.com

Sie können hier auf die Dokumentation zum Tomcat-Filter verweisen

Vielen Dank

Shinto Joseph
quelle
1

Hallo, dies ist der Weg, um das CORS-Problem im Knoten zu lösen. Fügen Sie einfach diese Zeilen auf der Seite "api" des Servers in Node.js (oder in Ihrer Server-Datei) hinzu, bevor Sie sicherstellen, dass "cors" installiert wird.

    const express = require('express');
    const app = express();
    app.use(express.json());
    var cors = require('cors');
    app.use(cors());
Saad Abbasi
quelle
0

benutze dataType: 'jsonp', funktioniert bei mir.

   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               
hoogw
quelle
0

Verwenden Sie dies für PHP, um Header festzulegen.

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");
Hamza Waleed
quelle
0
router.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "*");
res.header("Access-Control-Allow-Headers", "*");
next();});

Fügen Sie dies zu Ihren Routen hinzu, die Sie vom Front-End aus anrufen. Wenn Sie beispielsweise http: // localhost: 3000 / users / register aufrufen , müssen Sie dieses Codefragment in Ihre Back-End-JS-Datei einfügen, die diese Route enthält.

Sujeewa K. Abeysinghe
quelle
0

Wenn Sie nach der Lösung suchen und Express hier verwenden, ist dies die schnelle Lösung.

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

1) Installieren Sie cors mit npm npm install cors --save

2) importiere es [erforderlich] const cors = require('cors')

3) Verwenden Sie es als Middleware app.use(cors())

Einzelheiten und Verwendung von Cors . Das ist es, hoffentlich funktioniert es.

Badri Paudel
quelle