Pourquoi suis-je vois une erreur « origine est interdite par Access-Control-Allow-Origin » ici? [dupliquer]

StackOverflow https://stackoverflow.com/questions/9310112

Question

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

Que peut faire cela, et comment puis-je le résoudre?

Était-ce utile?

La solution

Javascript est limité lors des requêtes ajax en dehors du domaine actuel.

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

Javascript est limitée par la « règle d'origine » pour des raisons de sécurité afin qu'un script malveillant ne peut pas communiquer avec un serveur distant et envoyer des données sensibles.

jsonp est une autre façon d'utiliser JavaScript. Vous faites une demande et les résultats sont encapsulées dans une fonction de rappel qui est exécutée dans le client. Il est le même que celui qui relie une nouvelle balise de script dans la partie de la tête de votre code html (vous savez que vous pouvez charger des scripts à partir de domaines différents que les vôtres 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 compter sur un proxy côté serveur (PHP, ASP, etc.). Il y a beaucoup de guides liés à ce sujet, il suffit de Google!

Autres conseils

XMLHttpRequest ne vous permettra d'atteindre localhost:8080 à cause de la « règle d'origine ».

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

Access-Control-Allow-Origin: *

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

En savoir plus sur les demandes ajax Cross-origin sur https://developer.mozilla.org/en/http_access_control

Si vous utilisez Chrome, une solution simple (uniquement à des fins de développement) est d'utiliser l'option --disable-web-security.

Ajouter un Global.asax dans votre solution.

Ajouter

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

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

Si votre apache en utilisant, cela fonctionne: mettre cela en / créer un fichier .htaccess dans votre racine publique, et ajouter d'autres extensions de fichier que 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>

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

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

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

Ici, nous devons faire deux choses pour Apache Http

1) Dans le fichier httpd.config, supprimez ce fichier

LoadModule headers_module modules/mod_headers.so

2) Ajoutez cette ligne au fond.

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

si vous êtes en utilisant google chrome comme navigateur, vous pouvez ajouter l'extension CORS, et l'activer, il va résoudre le problème du trou sans avoir à quoi que ce soit de changement dans votre code

Rien à voir avec cette question particulière, mais pour tout le monde dans cette situation en utilisant jQuery ... Cette erreur est également due si vous essayez de faire une demande JSONP en utilisant jQuery et omettez le paramètre de rappel magique: callback=?

Si vous êtes d'un arrière-plan java une solution possible pourrait être de faire une servlet qui appelle les services Web pour votre javascript. quelque chose comme le code ci-dessous la méthode GET (votre choix) ...

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 il suffit de spécifier l'URL comme nom de servlet !!

Je lance dans le même message d'erreur, lorsque vous utilisez ajax pour accéder à une page php (javascript et fichier php sont tous deux situés sur le même serveur).

La raison était que je spécifié l'adresse IP en tant que domaine dans mon JavaScript. Cela fait le navigateur croire que l'appel au fichier php est sur un autre serveur.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top