Mod-opmerking: deze vraag gaat over waarom XMLHttpRequest
/fetch
/etc. in de browser zijn onderworpen aan de beperkingen van het Hetzelfde toegangsbeleid (u krijgt fouten met vermelding van CORB of CORS), terwijl Postman dat niet is. Deze vraag gaat niet over het oplossen van een "No ‘Access-Control-Allow-Origin’…" fout. Het gaat erom waarom ze gebeuren.
Stop alsjeblieft met posten:
- CORS-configuraties voor elke taal/framework onder de zon. In plaats daarvan zoek uw relevante taal/raamwerkvraag.
- Services van derden die een verzoek toestaan om CORS te omzeilen
- Opdrachtregelopties voor het uitschakelen van CORS voor verschillende browsers
Ik probeer autorisatie uit te voeren met JavaScript door verbinding te maken met de RESTful API ingebouwde Flask. Wanneer ik het verzoek doe, krijg ik echter de volgende foutmelding:
XMLHttpRequest kan http://myApiUrl/login niet laden. Er is geen ‘Access-Control-Allow-Origin’-header aanwezig op de aangevraagde bron. Origin ‘null’ heeft daarom geen toegang.
Ik weet dat de API of externe bron de header moet instellen, maar waarom werkte het toen ik het verzoek deed via de Chrome-extensie Postbode?
Dit is de verzoekcode:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
Antwoord 1, autoriteit 100%
Als ik het goed heb begrepen, doet u een XMLHttpRequest naar een ander domein dan uw pagina is Aan. Dus de browser blokkeert het omdat het om veiligheidsredenen meestal een verzoek in dezelfde oorsprong toestaat. U moet iets anders doen als u een domeinoverschrijdend verzoek wilt doen. Een tutorial over hoe je dat kunt bereiken is CORS gebruiken.
Als u postbode gebruikt, worden deze niet beperkt door dit beleid. Geciteerd uit Cross-Origin XMLHttpRequest:
Gewone webpagina’s kunnen het XMLHttpRequest-object gebruiken om gegevens van externe servers te verzenden en te ontvangen, maar ze worden beperkt door hetzelfde oorsprongsbeleid. Extensies zijn niet zo beperkt. Een extensie kan communiceren met externe servers buiten de oorsprong, zolang deze eerst om cross-origin-machtigingen vraagt.
Antwoord 2, autoriteit 20%
WAARSCHUWING: Het gebruik van
Access-Control-Allow-Origin: *
kan uw API/website kwetsbaar maken voor cross-site request forgery (CSRF) aanvallen. Zorg ervoor dat u de risico’s begrijpt voordat u deze code gebruikt.
Het is heel eenvoudig op te lossen als je PHP gebruikt. Voeg gewoon het volgende script toe aan het begin van uw PHP-pagina die het verzoek afhandelt:
<?php header('Access-Control-Allow-Origin: *'); ?>
Als je Node-red gebruikt, moet je CORS in het bestand node-red/settings.js
door het volgende te verwijderen regels:
// The following property can be used to configure cross-origin resource sharing
// in the HTTP nodes.
// See https://github.com/troygoode/node-cors#configuration-options for
// details on its contents. The following is a basic permissive set of options:
httpNodeCors: {
origin: "*",
methods: "GET,PUT,POST,DELETE"
},
Als je Flask hetzelfde gebruikt als de vraag; je moet eerst flask-cors
. installeren
$ pip install -U flask-cors
Vermeld dan de Flask cors in uw aanvraag.
from flask_cors import CORS
Een eenvoudige applicatie ziet er als volgt uit:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route("/")
def helloWorld():
return "Hello, cross-origin-world!"
Voor meer details kun je de Flask-documentatie raadplegen.
Antwoord 3, autoriteit 6%
Omdat
$.ajax({type: "POST" – roept OPTIES
aan
$.post( – Oproepen POST
Beide zijn verschillend. Postbode roept “POST” goed, maar als we het noemen, zijn het "OPTIES".
Voor C#-webservices – Web-API
Voeg de volgende code toe aan uw web.config-bestand onder <system.webServer> label. Dit zal werken:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
Zorg ervoor dat u geen fouten maakt in de Ajax-oproep
jQuery
$.ajax({
url: 'http://mysite.microsoft.sample.xyz.com/api/mycall',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
type: "POST", /* or type:"GET" or type:"PUT" */
dataType: "json",
data: {
},
success: function (result) {
console.log(result);
},
error: function () {
console.log("error");
}
});
Opmerking: als u op zoek bent naar het downloaden van inhoud van een website van derden, dan zal dit u niet helpen. Je kunt de volgende code proberen, maar niet JavaScript.
System.Net.WebClient wc = new System.Net.WebClient();
string str = wc.DownloadString("http://mysite.microsoft.sample.xyz.com/api/mycall");
Antwoord 4, autoriteit 2%
In het onderstaande onderzoek als API gebruik ik http://example.com in plaats van http://myApiUrl/login van uw vraag, omdat deze eerste werkt.
Ik neem aan dat uw pagina op http://my-site.local:8088.
De reden waarom u verschillende resultaten ziet, is dat Postman:
- set header
Host=example.com
(uw API) - Koptekst
Origin
NIET instellen
Dit is vergelijkbaar met de manier waarop browsers verzoeken verzenden wanneer de site en API hetzelfde domein hebben (browsers stellen ook het headeritem Referer=http://my-site.local:8088
in), maar ik zie het niet in Postman). Als de kop Origin
niet is ingesteld, staan de servers gewoonlijk dergelijke verzoeken standaard toe.
Dit is de standaard manier waarop Postman verzoeken verzendt. Maar een browser verzendt verzoeken anders wanneer uw site en API verschillende domeinen hebben, en dan CORS gebeurt en de browser automatisch:
- stelt header
Host=example.com
in (de jouwe als API) - zet header
Origin=http://my-site.local:8088
(uw site)
(De kop Referer
heeft dezelfde waarde als Origin
). En nu in de Console & Tabblad Netwerken ziet u:
Als je Host != Origin
hebt, is dit CORS, en wanneer de server een dergelijk verzoek detecteert, wordt het gewoonlijk blokkeert het standaard .
Origin=null
wordt ingesteld wanneer u HTML-inhoud opent vanuit een lokale map en een verzoek verzendt. Dezelfde situatie is wanneer u een verzoek verzendt binnen een <iframe>
, zoals in het onderstaande fragment (maar hier is de Host
-header helemaal niet ingesteld) – in het algemeen , overal waar de HTML-specificatie ondoorzichtige oorsprong zegt, kun je dat vertalen naar Origin=null
. Meer informatie hierover vind je op hier.
fetch('http://example.com/api', {method: 'POST'});
Look on chrome-console > network tab
Antwoord 5
Het toepassen van een CORS-beperking is een beveiligingsfunctie gedefinieerd door een server en geïmplementeerd door een browser.
De browser kijkt naar het CORS-beleid van de server en respecteert dit.
De Postman-tool houdt zich echter niet bezig met het CORS-beleid van de server.
Daarom verschijnt de CORS-fout in de browser, maar niet in Postman.
Antwoord 6
Dezelfde fout tegengekomen in verschillende gebruikssituaties.
Gebruiksvoorbeeld: In chrome wanneer geprobeerd het Spring REST eindpunt in hoekig aan te roepen.
Oplossing: voeg @CrossOrigin(“*”) annotatie toe bovenop de respectievelijke controllerklasse.
Antwoord 7
Als u die beperking wilt omzeilen bij het ophalen van de inhoud met fetch API of XMLHttpRequest in javascript, kunt u een proxyserver gebruiken zodat deze de header Access-Control-Allow-Origin
instelt op *
.
const express = require('express');
const request = require('request');
const app = express();
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
next();
});
app.get('/fetch', (req, res) => {
request(
{ url: req.query.url },
(error, response, body) => {
if (error || response.statusCode !== 200) {
return res.status(500).send('error');
}
res.send(body);
}
)
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`listening on ${PORT}`));
Hierboven staat een voorbeeldcode (node Js vereist) die als proxyserver kan fungeren. Bijvoorbeeld: als ik https://www.google.com
wil ophalen, wordt er normaal gesproken een CORS-fout gegenereerd, maar nu het verzoek wordt verzonden via de proxyserver die lokaal wordt gehost op poort 3000, wordt de proxy server voegt de Access-Control-Allow-Origin
header toe aan het antwoord en er zal geen probleem zijn.
Stuur een GET-verzoek naar http://localhost:3000/fetch?url=Your URL here
, in plaats van het verzoek rechtstreeks naar de URL te sturen die u wilt ophalen.
Your URL here
staat voor de URL die u wilt ophalen, bijvoorbeeld: https://www.google.com
Antwoord 8
De fout die u krijgt, is te wijten aan de CORS-standaard, die een aantal beperkingen stelt aan de manier waarop JavaScript ajax-verzoeken kan uitvoeren.
De CORS-standaard is een client-side standaard, geïmplementeerd in de browser. Het is dus de browser die voorkomt dat de oproep wordt voltooid en de foutmelding genereert – niet de server.
Postman implementeert de CORS-beperkingen niet, daarom ziet u niet dezelfde fout wanneer u dezelfde oproep doet vanuit Postman.
Waarom implementeert Postman geen CORS? CORS definieert de beperkingen met betrekking tot de oorsprong (URL-domein) van de pagina die het verzoek initieert. Maar in Postman zijn de verzoeken niet afkomstig van een pagina met een URL, dus CORS is niet van toepassing.
Antwoord 9
Alleen voor .NET Core Web API-project, voeg de volgende wijzigingen toe:
- Voeg de volgende code toe na de regel
services.AddMvc()
in de methodeConfigureServices()
van het bestand Startup.cs:
services.AddCors(allowsites=>{allowsites.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
});
- Voeg de volgende code toe na de regel
app.UseMvc()
in de methodeConfigure()
van het bestand Startup.cs:
app.UseCors(options => options.AllowAnyOrigin());
- Open de controller waartoe u toegang wilt buiten het domein en voeg dit volgende kenmerk toe op controllerniveau:
[EnableCors("AllowOrigin")]
Antwoord 10
Als u .NET als uw middelste laag gebruikt, controleer dan duidelijk het routekenmerk, bijvoorbeeld
Ik had een probleem toen het zo was,
[Route("something/{somethingLong: long}")] //Space.
Hiermee opgelost,
[Route("something/{somethingLong:long}")] //No space
Antwoord 11
Gebruikt u Webfonts van Google, Typekit, enzovoort?
Er zijn meerdere manieren waarop u Webfonts kunt gebruiken, zoals @font-face of CSS3-methoden, sommige browsers zoals Firefox & IE kan om dezelfde veiligheidsreden weigeren het lettertype in te sluiten wanneer het afkomstig is van een niet-standaard URL van een derde partij (zoals uw blog).
Om een probleem met je WordPress-blog op te lossen, plaats je het hieronder in je .htaccess-bestand.
<IfModule mod_headers.c>
<FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>