Ich bin mehrmals auf CORS-Probleme gestoßen und kann sie normalerweise beheben, aber ich möchte sie wirklich verstehen, indem ich dies anhand eines MEAN-Stack-Paradigmas sehe.
Früher habe ich einfach Middleware in meinen Express-Server eingefügt, um diese Dinge abzufangen, aber es sieht so aus, als ob es eine Art Pre-Hook gibt, der meine Anfragen fehlerhaft macht.
Anforderungsheaderfeld Access-Control-Allow-Headers wird von Access-Control-Allow-Headern in der Preflight-Antwort nicht zugelassen
Ich nahm an, dass ich das tun könnte:
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Headers","*")
})
oder das Äquivalent, aber das scheint es nicht zu beheben. Ich habe es natürlich auch versucht
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Headers","Access-Control-Allow-Headers")
})
Immer noch kein Glück.
Access-Control-Request-Headers
header("Access-Control-Allow-Headers: Content-Type")
Dies ist, was Sie hinzufügen müssen, damit es funktioniert.
Der Browser sendet eine Preflight-Anforderung (mit dem Methodentyp OPTIONS), um zu überprüfen, ob der auf dem Server gehostete Dienst vom Browser in einer anderen Domäne aus aufgerufen werden darf. Als Antwort auf die Preflight-Anfrage, wenn Sie die obigen Header einfügen, versteht der Browser, dass es in Ordnung ist, weitere Anrufe zu tätigen, und ich erhalte eine gültige Antwort auf meinen tatsächlichen GET / POST-Anruf. Sie können die Domäne, auf die der Zugriff gewährt wird, einschränken, indem Sie Access-Control-Allow-Origin "," localhost, xvz.com "anstelle von * verwenden. (* gewährt Zugriff auf alle Domänen)
quelle
*
für...-Origin
undtrue
für kombinieren...-Credentials
. Es schlägt nicht für Anforderungen ohne Anmeldeinformationen fehl, aber es funktioniert auch nicht für Anforderungen mit Anmeldeinformationen. Siehe den Link, den ich in meiner Antwort gepostet habe.response.setHeader("Access-Control-Allow-Headers", "*")
? Was bedeutet dies für die Sicherheit?Dieses Problem wurde mit gelöst
Besonders in meinem Projekt (express.js / nodejs)
Aktualisieren:
Jedes Mal Fehler:
Access-Control-Allow-Headers is not allowed by itself in preflight response
Fehler Sie können sehen, was mit dem Chrome Developer Tool falsch ist :obiger Fehler fehlt
Content-Type
so hinzufügen ZeichenfolgeContent-Type
zuAccess-Control-Allow-Headers
quelle
Die akzeptierte Antwort ist in Ordnung, aber ich hatte Schwierigkeiten, sie zu verstehen. Hier ist ein einfaches Beispiel, um dies zu verdeutlichen.
In meiner Ajax-Anfrage hatte ich einen Standard-Authorization-Header.
Dieser Code erzeugt den Fehler in der Frage. Was ich auf meinem nodejs-Server tun musste, war, Autorisierung in zulässigen Headern hinzuzufügen:
quelle
Zu den anderen Antworten hinzufügen. Ich hatte das gleiche Problem und dies ist der Code, den ich in meinem Express-Server verwendet habe, um REST-Aufrufe zuzulassen:
Dieser Code fängt im Grunde alle Anforderungen ab und fügt die CORS-Header hinzu. Fahren Sie dann mit meinen normalen Routen fort. Wenn eine OPTIONS-Anforderung vorliegt, antwortet diese nur mit den CORS-Headern.
BEARBEITEN: Ich habe dieses Update für zwei separate NodeJS Express-Server auf demselben Computer verwendet. Am Ende habe ich das Problem mit einem einfachen Proxyserver behoben.
quelle
Ich bin gerade selbst auf dieses Problem gestoßen. Stellen Sie im Kontext von ASP.NET sicher, dass Ihre Web.config folgendermaßen aussieht:
Beachten Sie den Autorisierungswert für den
Access-Control-Allow-Headers
Schlüssel. Mir fehlte der Autorisierungswert. Diese Konfiguration löst mein Problem.quelle
Sehr gut, ich habe dies für ein Silex-Projekt verwendet
quelle
In Chrome:
Für mich wurde dieser Fehler durch ein nachfolgendes Leerzeichen in der URL dieses Aufrufs ausgelöst .
quelle
Nur um hinzuzufügen, dass Sie diese Header auch in die Webpack-Konfigurationsdatei einfügen können. Ich brauchte sie wie in meinem Fall, als ich den Webpack Dev Server ausführte.
quelle
res.setHeader ('Access-Control-Allow-Headers', '*');
quelle
Ich habe den Fehler erhalten, den das OP mit Django, React und der Django-Cors-Header-Bibliothek angegeben hat. Gehen Sie wie folgt vor, um das Problem mit diesem Stapel zu beheben:
Fügen Sie in settings.py das Folgende gemäß der offiziellen Dokumentation hinzu .
quelle
Dieses Problem tritt auf, wenn wir einen benutzerdefinierten Header für die Anforderung erstellen. Diese Anforderung verwendet die
HTTP OPTIONS
und enthält mehrere Header.Der erforderliche Header für diese Anforderung ist
Access-Control-Request-Headers
, der Teil des Antwortheaders sein und eine Anforderung von allen Ursprüngen zulassen sollte. Manchmal braucht esContent-Type
auch im Header der Antwort. Ihr Antwortheader sollte also so sein -quelle
Beim Post-API-Aufruf senden wir Daten im Anforderungshauptteil. Wenn wir also Daten senden, indem wir einem API-Aufruf einen zusätzlichen Header hinzufügen. Dann erfolgt zuerst der API-Aufruf OPTIONS und dann der Aufruf nach dem Aufruf. Daher müssen Sie zuerst den OPTION-API-Aufruf verarbeiten.
Sie können das Problem beheben, indem Sie einen Filter schreiben, in dem Sie nach API-Aufrufen für Optionsaufrufe suchen und den Status 200 OK zurückgeben müssen. Unten ist der Beispielcode:
quelle
Wenn Sie versuchen, den Anforderungsheadern einen benutzerdefinierten Header hinzuzufügen, müssen Sie dem Server mitteilen, dass ein bestimmter Header zulässig ist. Der Ort dafür ist in der Klasse, die die Anforderungen filtert. In dem unten gezeigten Beispiel lautet der benutzerdefinierte Headername "Typ":
quelle
Nachdem ich fast einen Tag verbracht hatte, fand ich gerade heraus, dass das Hinzufügen der folgenden zwei Codes mein Problem löste.
Fügen Sie dies in die Datei Global.asax ein
und fügen Sie in der Webkonfiguration Folgendes hinzu
quelle
Auch ich hatte das gleiche Problem in Angular 6. Ich habe das Problem mithilfe des folgenden Codes gelöst. Fügen Sie den Code in die Datei component.ts ein.
quelle
Das gleiche Problem, mit dem ich konfrontiert war.
Ich habe eine einfache Änderung vorgenommen.
quelle
Es ist klar, dass die Autorisierung in der API nicht zulässig ist. Set
Access-Control-Allow-Header setzen: "Inhaltstyp, Autorisierung"
quelle
Das Hinzufügen von Cors in der Get-Funktion hat bei mir funktioniert
quelle