Für den angeforderten Ressourcenfehler ist kein Header 'Access-Control-Allow-Origin' vorhanden


93

Ich versuche, den Feed einer Nachrichten-Website abzurufen. Ich dachte, ich würde die Feed-API von Google verwenden, um den Feedburner-Feed in JSON zu konvertieren. Die folgende URL gibt 10 Beiträge aus dem Feed im JSON-Format zurück. http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi

Ich habe den folgenden Code verwendet, um den Inhalt der obigen URL abzurufen

$.ajax({
  type: "GET",
  dataType: "jsonp",
  url: "http://ajax.googleapis.com/ajax/services/feed/load",
  data: {
    "v": "1.0",
    "num": "10",
    "q": "http://feeds.feedburner.com/mathrubhumi"
  },
  success: function(result) {
    //.....
  }
});

aber es funktioniert nicht und ich erhalte den folgenden Fehler

XMLHttpRequest kann http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http%3A%2F%2Ffeeds.feedburner.com%2Fmathrubhumi nicht laden . In der angeforderten Ressource ist kein Header 'Access-Control-Allow-Origin' vorhanden. Origin ' http: // localhost ' ist daher kein Zugriff gestattet.

Wie behebe ich das?


1
Ich habe Ihren Code hier mit Chrome getestet und wie erwartet gearbeitet. Haben Sie versucht, das Attribut "crossDomain: true" zu verwenden?
Daniel Loureiro

Ich habe Ihren Code hier gehostet: learnwithdaniel.com/test.html . Überprüfen Sie, ob Sie fehlerfrei öffnen können. Wenn Sie keine Fehlermeldung erhalten, liegt das Problem bei Ihrem Server
Daniel Loureiro

großartig. Es hängt also mit den Headern zusammen, die Sie vom Server senden, wenn Ihr Browser eine Anfrage für dieses HTML stellt. Suchen Sie nach "cors headers"
Daniel Loureiro

das gleiche hier mit godaddy api
Gilson Gilbert

Ist diese Frage nicht ein Duplikat? stackoverflow.com/questions/20035101/… Noch wichtiger ist, dass diese andere Frage klarere / gründlichere Antworten hat.
Die rote Erbse

Antworten:


85

Ich glaube , dies könnte wahrscheinlich sein , dass Chrome nicht unterstützt , localhostum durch die Access-Control-Allow-Origin- siehe Chrome Ausgabe

Um Chrome Access-Control-Allow-Originin den Header zu senden , müssen Sie Ihren lokalen Host in Ihrer Datei / etc / hosts einfach an eine andere Domain aliasen, z.

127.0.0.1   localhost yourdomain.com

Dann , wenn Sie Ihren Skript zugreifen würden yourdomain.comstatt localhost, soll der Aufruf erfolgreich.


Danke dir. Bei diesem Problem und dem Wechsel zu IE Edge wurde der zugrunde liegende Fehler in meinem Servercode angezeigt, der durch die Verweigerung von localhost durch Chrome verdeckt wurde.
Aluan Haddad

7
Funktioniert auch bei mir nicht. Vielleicht hat ein Update auf Chrome diese "Lücke" blockiert?
Marty C.

2
Auch hier keine Hilfe. Meine Website ist bereits so eingerichtet, aber ich habe einen großen Unterschied. Ich benutze einen anderen Port. Ich bin sicher, wenn es der gleiche Port wäre, würde es funktionieren. HTTP vs. HTTPS sind natürlich verschiedene Ports, so dass einige von Ihnen Probleme verursachen können. Meins ist nicht speziell HTTPS, aber ich versuche, auf etwas in derselben Domain zuzugreifen, aber auf einen anderen Port als 80.
Jerry Dodge

Was passiert , wenn die API durch eine Chrom - Erweiterungen zugegriffen wird, was kann getan werden
viveksinghggits

111

Wenn Sie den Google Chrome-Browser verwenden, können Sie mit einer Erweiterung hacken.

In Ihrer Anwendung finden Sie eine Chrome-Erweiterung , mit der CORS-Header im laufenden Betrieb geändert werden können. Natürlich ist dies nur Chrome, aber ich mag es, dass es überall ohne Änderungen funktioniert.

Sie können es zum Debuggen Ihrer App auf einem lokalen Computer verwenden (wenn in der Produktion alles funktioniert).

Hinweis : Wenn die URL beschädigt wird, lautet der Name der Erweiterung Access-Control-Allow-Origin: * . Ich empfehle dir, diese Erweiterung zu deaktivieren, wenn du nicht an deinen Sachen arbeitest, weil beispielsweise YouTube mit dieser Erweiterung nicht funktioniert.


Das hat definitiv auch bei mir funktioniert! ... Ich denke, der Entwickler des Plugins hat es so aktualisiert, dass es zu bestimmten URLs passt, die Sie manuell eingegeben haben, als für alles zu funktionieren. Ich habe Youtube und andere Websites besucht und es funktioniert einwandfrei. Trotzdem vielen Dank.
Kingston Fortune

1
Es dient nur zum Testen während der Entwicklung. Die Benutzer werden das Plugin nicht im Browser hinzufügen
Caption Newt

Anscheinend ist diese Erweiterung zumindest unter dieser URL nicht mehr verfügbar. Diese Erweiterung scheint jedoch zu funktionieren: chrome.google.com/webstore/detail/allow-cors-access-control/…
Gordon

Aber was ist diese Erweiterung zu tun ? Kennen Sie eine Open-Source-Version oder wissen Sie, wie Sie eine schreiben können, die Header auf diese Weise ändert? Sie möchten wahrscheinlich nicht (na ja , okay, ich möchte nicht) eine Erweiterung ausführen, die vollen Zugriff auf URLs und Daten hat, ohne zu wissen, was sie tut. Scheint so, als könnte dies eine sehr schlechte Idee sein, wenn die Erweiterung den Besitzer wechselt, bereits schändlich ist usw. BEARBEITEN: Die unten erwähnte ist Open Source , fwiw.
Ruffin

9

Versuchen Sie Folgendes: Setzen Sie den Ajax-Aufruf, indem Sie den Header wie folgt einrichten:

var uri = "http://localhost:50869/odata/mydatafeeds"
$.ajax({
    url: uri,
    beforeSend: function (request) {
        request.setRequestHeader("Authorization", "Negotiate");
    },
    async: true,
    success: function (data) {
        alert(JSON.stringify(data));
    },
    error: function (xhr, textStatus, errorMessage) {
        alert(errorMessage);
    }                
});

Führen Sie dann Ihren Code aus, indem Sie Chrome mit der folgenden Befehlszeile öffnen:

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

1

Nur zu Ihrer Information, ich habe diese Informationen aus der jQuery-Dokumentation bemerkt, von denen ich glaube, dass sie für dieses Problem gelten:

Aufgrund von Sicherheitsbeschränkungen des Browsers unterliegen die meisten "Ajax" -Anfragen derselben Ursprungsrichtlinie . Die Anforderung kann Daten aus einer anderen Domäne, Subdomäne, einem anderen Port oder einem anderen Protokoll nicht erfolgreich abrufen.

Das Ändern der Hosts-Datei wie @thanix hat bei mir nicht funktioniert, aber die von @dkruchok erwähnte Erweiterung hat das Problem gelöst.


0

In Chrome können Sie nicht zwei verschiedene localhost integrieren. Deshalb wird dieser Fehler angezeigt. Sie müssen nur das Microsoft Visual Studio Web Api Core-Paket vom Nuget Manager einbinden. Fügen Sie die beiden Codezeilen in den WebApi-Projekten in Ihre WebApiConfig.cs Datei ein.

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

Dann ist alles erledigt.


Dies gilt natürlich nur für Dotnet-Core-Backends
leider

0

Wenn es Spring Boot Service aufruft. Sie können damit mit dem folgenden Code umgehen.

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS")
                    .allowedHeaders("*", "Access-Control-Allow-Headers", "origin", "Content-type", "accept", "x-requested-with", "x-requested-by") //What is this for?
                    .allowCredentials(true);
        }
    };
}

0

Für die Entwicklung können Sie https://cors-anywhere.herokuapp.com verwenden . Für die Produktion ist es besser, einen eigenen Proxy einzurichten

async function read() {
   let r= await (await fetch('https://cors-anywhere.herokuapp.com/http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi')).json();
   console.log(r);
}

read();


0

cors unblock funktioniert hervorragend für Chrome 78 [COrs unb] [1] https://chrome.google.com/webstore/detail/cors-unblock/lfhmikememgdcahcdlaciloancbhjino

Es ist ein Plugin für Google Chrome namens "cors unblock".

Zusammenfassung: Kein CORS-Fehler mehr durch Anhängen des Headers 'Access-Control-Allow-Origin: *' an lokale und Remote-Webanforderungen, wenn diese aktiviert sind

Diese Erweiterung bietet Kontrolle über XMLHttpRequest- und Abrufmethoden, indem für jede Anforderung, die der Browser empfängt, benutzerdefinierte Header "Zugriffssteuerungs-Zulassungsursprung" und "Zugriffssteuerungs-Zulassungsmethoden" bereitgestellt werden. Ein Benutzer kann die Erweiterung über die Symbolleistenschaltfläche ein- und ausschalten. Verwenden Sie die Kontextmenüelemente mit der rechten Maustaste, um zu ändern, wie diese Überschriften geändert werden. Sie können anpassen, welche Methoden zulässig sind. Die Standardoption besteht darin, die Methoden 'GET', 'PUT', 'POST', 'DELETE', 'HEAD', 'OPTIONS' und 'PATCH' zuzulassen. Sie können die Erweiterung auch bitten, diese Header nicht zu überschreiben, wenn der Server sie bereits füllt.


0

Nun , eine andere Möglichkeit ist, dass Sie bei Verwendung des Cors-Proxys nur https://cors-anywhere.herokuapp.com/ hinzufügen müssen, bevor Ihre URL lautet. So wird Ihre URL aussehen https://cors-anywhere.herokuapp.com/http : //ajax.googleapis.com/ajax/services/feed/load .

Der Proxyserver erhält die http://ajax.googleapis.com/ajax/services/feed/load von der oben angegebenen URL. Dann wird die Anfrage gestellt, um die Antwort dieses Servers zu erhalten. Und schließlich wendet der Proxy die

Access-Control-Allow-Origin: *

auf diese ursprüngliche Antwort.

Diese Lösung ist großartig, da sie sowohl in der Entwicklung als auch in der Produktion funktioniert. Zusammenfassend nutzen Sie die Tatsache, dass die Richtlinie mit demselben Ursprung nur in der Kommunikation zwischen Browser und Server implementiert ist. Das heißt, es muss nicht in der Server-zu-Server-Kommunikation erzwungen werden!

Weitere Informationen zur Lösung finden Sie hier auf Medium 3 Möglichkeiten zur Behebung des CORS-Fehlers


-5

Bitte verwenden Sie @CrossOriginauf dem backendsideIn-Spring-Boot-Controller (entweder Klassen- oder Methodenebene), da die Lösung für den Chrome- 'No 'Access-Control-Allow-Origin'Fehlerheader in der angeforderten Ressource vorhanden ist. '

Diese Lösung funktioniert bei mir zu 100% ...

Beispiel: Klassenstufe

@CrossOrigin
@Controller
public class UploadController {

----- ODER -------

Beispiel: Methodenebene

@CrossOrigin(origins = "http://localhost:3000", maxAge = 3600)
@RequestMapping(value = "/loadAllCars")
    @ResponseBody
    public List<Car> loadAllCars() {


Ref: https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

Dies beantwortet sicherlich nicht die Frage des OP, hat aber einen gültigen Punkt. Um Spring RESTful Services / Daten über Javascript zu nutzen, müssen Sie die @CrossOriginAnmerkung festlegen . An alle, die abstimmen: Bitte geben Sie Ihren Grund an!
rwenz3l
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.