wake-up-neo.com

Warum wird hier der Fehler "Origin wird von Access-Control-Allow-Origin nicht zugelassen" angezeigt?

Ich sehe folgenden Fehler:

Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin

mit diesem Code:

var http = new getXMLHttpRequestObject();
var url = "http://gdata.youtube.com/action/GetUploadToken";
var sendXML = '<?xml version="1.0"?><entry xmlns="http://www.w3.org/2005/Atom"'+
    'xmlns:media="http://search.yahoo.com/mrss/'+
    'xmlns:yt="http://gdata.youtube.com/schemas/2007">'+
    '<media:group><media:title type="plain">My First API</media:title>'+
    '<media:description type="plain">First API</media:description>'+
    '<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>'+
    '<media:keywords>first, api</media:keywords></media:group></entry>';
http.open("POST", url, true);
http.setRequestHeader("Authorization", "AuthSub token=" + AccessToken);
http.setRequestHeader("X-GData-Key", "key="+ dev_key);
http.setRequestHeader("Content-Type", "application/atom+xml; charset=UTF-8");

http.onreadystatechange = function() {
    if(http.readyState == 4) {
        alert(http.responseXML);
    }
}
http.send(sendXML);

Was kann das verursachen und wie löse ich das?

151
Muhammad Usman

Javascript ist begrenzt, wenn Ajax-Anfragen außerhalb der aktuellen Domain gestellt werden.

  • Beispiel 1: Ihre Domain ist example.com und Sie möchten eine Anfrage an test.com stellen => dies ist nicht möglich.
  • Bsp 2: Ihre Domain ist example.com und Sie möchten eine Anfrage an inner.example.com stellen => das ist nicht möglich.
  • Bsp. 3: Ihre Domain lautet example.com:80 und Sie möchten eine Anfrage an example.com:81 stellen => dies ist nicht möglich
  • EX 4: Ihre Domain ist example.com und Sie möchten eine Anfrage an example.com stellen => das können Sie.

Aus Sicherheitsgründen wird Javascript durch die "gleiche Origin-Richtlinie" eingeschränkt, sodass ein böswilliges Skript keine Verbindung zu einem Remoteserver herstellen und keine vertraulichen Daten senden kann.

jsonp ist eine andere Art, Javascript zu benutzen. Sie stellen eine Anfrage und die Ergebnisse werden in eine Rückruffunktion eingekapselt, die im Client ausgeführt wird. Es ist dasselbe wie das Verknüpfen eines neuen Skript-Tags mit dem Hauptteil Ihres HTML-Codes (Sie wissen, dass Sie Skripte aus anderen Domänen als Ihrer hier laden können).
Um jedoch jsonp verwenden zu können, muss der Server ordnungsgemäß konfiguriert sein. Ist dies nicht der Fall, können Sie jsonp nicht verwenden und MÜSSEN sich auf einen serverseitigen Proxy (PHP, ASP usw.) verlassen. Es gibt viele Anleitungen zu diesem Thema, googeln Sie einfach!

171
andreapier

Mit XMLHttpRequest können Sie localhost:8080 Aufgrund der "gleichen Origin-Richtlinie" nicht erreichen.

Sie können Anfragen von modernen Browsern zulassen, indem Sie Ihrer Antwort einen Header auf localhost:8080 Hinzufügen:

Access-Control-Allow-Origin: *

Sie können dies tun, indem Sie Ihrem HTTP-Server Direktiven hinzufügen oder Header über serverseitigen Code (PHP, Ruby, ...) hinzufügen.

Weitere Informationen zu Cross-Origin-Ajax-Anfragen finden Sie unter https://developer.mozilla.org/en/http_access_control

88
Sunny

Wenn Sie Chrome verwenden, können Sie dies einfach umgehen (nur zu Entwicklungszwecken), indem Sie die Option --disable-web-security Verwenden.

37
Deqing

Fügen Sie Ihrer Lösung ein global.asax hinzu.

Hinzufügen

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

im

protected void Application_BeginRequest(object sender, EventArgs e)
{
}
10
Ammar Khan

Wenn Sie Apache verwenden, funktioniert Folgendes: Legen Sie diese in Ihr öffentliches Stammverzeichnis ein, erstellen Sie eine .htaccess-Datei, und fügen Sie gegebenenfalls weitere Dateierweiterungen hinzu.

<FilesMatch "\.(ttf|otf|eot|woff|jpg|png|jpeg|gif|js|json|html|css)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>
9
Eric Leroy

Für die lokale Entwicklung können Sie ein Tool zum Ändern der HTTP-Antwortheader verwenden. Zum Beispiel kann Charles dies mit dem mitgelieferten Rewrite-Tool tun: Rewrite-Tool

Fügen Sie einfach eine neue Regel für die Zieldomäne/den Zielort hinzu:

Type: Add Header
Where: Response
Replace
     Name: Access-Control-Allow-Origin
     Value: *
Replace All
7

Hier müssen wir zwei Dinge für Apache Http tun

1) Kommentieren Sie diese Datei in der Datei httpd.config aus

LoadModule headers_module modules/mod_headers.so

2) Fügen Sie diese Zeile unten hinzu.

Header set Access-Control-Allow-Origin "*"
4

wenn Sie google chrome als Browser verwenden, können Sie die CORS-Erweiterung hinzufügen und aktivieren, um das Problem zu lösen, ohne dass Sie irgendetwas an Ihrem Code ändern müssen

3
Meriam

Keine Beziehung zu dieser speziellen Frage, aber für Personen in dieser Situation, die jQuery verwenden ... Dieser Fehler tritt auch auf, wenn Sie versuchen, eine JSONP-Anforderung mit jQuery zu erstellen und den magic callback-Parameter weglassen: callback=?

2
danwellman

Wenn Sie aus einem Java) - Hintergrund stammen, besteht eine mögliche Lösung darin, ein Servlet zu erstellen, das die Web-Services für Ihr Javascript aufruft. ..

JsonElement jelement;
    JsonArray jarray;
    try {
        URL url = new URL("http://rest."YOUR URL"#ba0482");
        URLConnection connection = url.openConnection();
        connection.setDoInput(true);
        InputStream inStream = connection.getInputStream();
        BufferedReader input = new BufferedReader(new InputStreamReader(inStream));

        jelement = new JsonParser().parse(input);

        jarray = jelement.getAsJsonArray();

        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        out.print(jarray);
        out.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Geben Sie nun im Javascript einfach die URL als Servlet-Namen an !!

2
Saty

Ich habe dieselbe Fehlermeldung erhalten, wenn ich mit Ajax auf eine PHP-Seite zugreife (Javascript und PHP-Datei befinden sich beide auf demselben Server).

Der Grund war, dass ich die IP-Adresse als Domain in meinem JavaScript angegeben habe. Dies ließ den Browser glauben, dass sich der Aufruf der PHP-Datei auf einem anderen Server befindet.

Also eine einfache Lösung, um diese Fehlermeldung loszuwerden. a) Stellen Sie sicher, dass sich Javascript und PHP-Datei auf demselben Server befinden. b) Stellen Sie sicher, dass die URL (insbesondere die Domain) in Ihrem JavaScript vorhanden ist (z. B. http://www.smartana.co.uk/myJavaScript.js =) Ajax spiegelt Ihre Server-URL wider (zB http://www.smartana.co.uk/myServer.php ).

0
Wolfi