Pourquoi suis-je voir une "origine n'est pas autorisée par Access-Control-Allow-Origin" erreur ici? [dupliquer]

cette question a déjà une réponse ici:

je vois l'erreur suivante:

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

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

quoi peut causer ça, et comment je le résous?

147
demandé sur reallynice 2012-02-16 15:01:55

11 réponses

Javascript est limité lors de requêtes ajax en dehors du domaine courant.

  • Ex 1: votre domaine est example.com et vous souhaitez faire une demande d'test.com => vous ne pouvez pas.
  • Ex 2: votre domaine est example.com et vous souhaitez faire une demande d'inner.example.com => vous ne pouvez pas.
  • Ex 3: votre domaine est de donner l'exemple.com:80 et vous souhaitez faire une demande à l'exemple.com:81 => vous ne pouvez pas
  • EX 4: votre domaine est example.com et vous souhaitez faire une demande d'example.com => vous pouvez.

Javascript est limité par la" même politique d'origine " pour des raisons de sécurité, de sorte qu'un script malveillant ne peut pas contacter un serveur distant et envoyer des données sensibles.

jsonp est une autre façon d'utiliser javascript. Vous faites une requête et les résultats sont encapsulés dans une fonction de rappel qui est exécutée dans le client. C'est la même chose que de lier une nouvelle balise de script dans la partie head de votre html (vous savez que vous pouvez charger des scripts provenant de domaines différents que le vôtre ici).

Toutefois, pour utiliser jsonp le serveur doit être configuré correctement. Si ce n'est pas le cas, vous ne pouvez pas utiliser jsonp et vous devez vous appuyer sur un proxy côté serveur (PHP, ASP, etc.). Il ya beaucoup de guides relatifs à ce sujet, il suffit de google!

169
répondu andreapier 2016-03-23 03:08:54

XMLHttpRequest ne vous permettra pas d'atteindre localhost:8080 à cause de la "même politique d'origine".

vous pouvez autoriser les requêtes des navigateurs modernes en ajoutant un en-tête à votre réponse sur localhost:8080 :

Access-Control-Allow-Origin: *

vous pouvez le faire en ajoutant des directives à votre serveur HTTP ou en ajoutant des en-têtes via le code côté serveur (PHP, Ruby, ...).

lire la suite de Cross-Origin ajax requests on https://developer.mozilla.org/en/http_access_control

88
répondu Sunny 2014-03-19 09:26:21

si vous utilisez Chrome, une solution simple (uniquement pour le développement) est d'utiliser l'option --disable-web-security .

37
répondu Deqing 2012-11-27 14:06:32

Ajouter un global.asax dans votre solution.

ajouter

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

dans

protected void Application_BeginRequest(object sender, EventArgs e)
{
}
10
répondu Ammar Khan 2013-01-20 02:11:39

si vous utilisez apache, cela fonctionne: mettez ceci dans/créez un .htaccess dans votre racine publique, et ajoutez des extensions de fichier dont vous pourriez avoir besoin.

<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
répondu Eric Leroy 2013-11-08 05:50:20

pour le développement local, vous pouvez utiliser un outil pour modifier les en-têtes de réponse HTTP. Par exemple Charles est capable de le faire par l'outil de réécriture inclus: outil de réécriture

il suffit d'ajouter une nouvelle règle pour le domaine cible/emplacement:

Type: Add Header
Where: Response
Replace
     Name: Access-Control-Allow-Origin
     Value: *
Replace All
7
répondu Christian Müller 2013-07-19 14:14:07

si vous utilisez google chrome comme navigateur, vous pouvez ajouter L'extension CORS , et l'activer, il va résoudre le problème trou sans avoir à changer quoi que ce soit dans votre code

3
répondu Meriam 2014-12-17 15:48:43

ici, nous devons faire deux choses pour Apache Http

1) Dans httpd.fichier de configuration, décompresser ce fichier

LoadModule headers_module modules/mod_headers.so

2) Ajouter cette ligne en bas.

Header set Access-Control-Allow-Origin "*"
3
répondu Sireesh Yarlagadda 2016-05-02 15:11:47

sans rapport avec cette question particulière, mais pour toute personne dans cette situation utilisant jQuery...Cette erreur est également causée si vous essayez de faire une requête JSONP en utilisant jQuery et omettez le paramètre magic callback: callback=?

2
répondu danwellman 2012-09-25 20:16:23

si vous êtes d'un fond java une solution possible pourrait être de faire un servlet qui appelle les services Web pour votre javascript. quelque chose comme le code ci-dessous dans la méthode GET(Your-choice)...

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

maintenant dans le javascript, spécifiez simplement l'url comme nom de servlet!!

2
répondu Saty 2013-01-09 14:27:00

je tombe sur le même message d'erreur, lorsque j'utilise ajax pour accéder à une page php (javascript et le fichier php sont tous deux situés sur le même serveur).

la raison en est que J'ai spécifié L'adresse IP comme domaine dans Mon JavaScript. Cela a fait croire au navigateur que l'appel au fichier php est sur un autre serveur.

donc une solution facile pour se débarrasser de ce message d'erreur. a) vérifier que javascript et les fichiers php sont sur le même serveur b) assurez-vous que l'url (dans en particulier le domaine) dans votre JavaScript (par exemple http://www.smartana.co.uk/myJavaScript.js ) ajax reflète l'url de votre serveur (par exemple http://www.smartana.co.uk/myServer.php ).

0
répondu Wolfi 2015-05-30 11:42:17