Origine http://localhost:3000 n'est pas autorisé par Access-Control-Allow-Origin

XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin. 

j'ai lu à propos des requêtes ajax inter-domaines, et je comprends le problème de sécurité sous-jacent. Dans mon cas, 2 serveurs fonctionnent localement, et aiment activer les requêtes de domaines croisés pendant les tests.

localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server

j'émets une requête ajax à localhost:8080 - GAE server pendant que ma page est chargée à partir du serveur de noeuds. Ce qui est le plus facile et le plus sûr ( ne voulez pas démarrer chrome avec l'option disable-web-security ). Si je dois changer 'Content-Type' , dois-je le faire à node le serveur? Comment?

97
demandé sur Rocket Hazmat 2013-09-05 21:50:27

10 réponses

Puisqu'ils fonctionnent sur différents ports, ils sont différents JavaScript origin . Peu importe qu'ils soient sur la même machine/Nom d'hôte.

vous devez activer CORS sur le serveur (localhost:8080). Consultez ce site: http://enable-cors.org /

vous N'avez qu'à ajouter un en-tête HTTP au serveur:

Access-Control-Allow-Origin: http://localhost:3000

Ou, pour plus de simplicité:

Access-Control-Allow-Origin: *
111
répondu Rocket Hazmat 2017-09-29 10:48:30

vous devez activer CORS pour résoudre ce

si votre application est créée avec un noeud simple.js

mettre dans vos en-têtes de réponse comme

var http = require('http');

http.createServer(function (request, response) {
response.writeHead(200, {
    'Content-Type': 'text/plain',
    'Access-Control-Allow-Origin' : '*',
    'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE'
});
response.end('Hello World\n');
}).listen(3000);

si votre application est créée avec express framework""

utiliser un middleware CORS comme

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
}

et Appliquer via

app.configure(function() {
    app.use(allowCrossDomain);
    //some other code
});    

voici deux liens de référence

  1. comment est-à-permettez-scro-en-express-nodejs
  2. plongée-en-node-js-très-premier-app #voir l'Ajax section

41
répondu mithunsatheesh 2017-05-23 11:55:11

si vous avez besoin d'un travail rapide dans Chrome pour les requêtes ajax, ce plugin chrome vous permet automatiquement d'accéder à n'importe quel site à partir de n'importe quelle source en ajoutant l'en-tête de réponse approprié

Chrome Extension Allow-Control-Allow-Origin: *

36
répondu Billy Baker 2016-06-15 15:54:01

j'accepte la réponse de @Rocket hazmat car elle me mène à la solution. C'était en effet sur le serveur GAE que j'avais besoin de mettre l'en-tête. J'ai dû mettre ces

"Access-Control-Allow-Origin" -> "*"
"Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"

seulement "Access-Control-Allow-Origin" a donné à l'erreur

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.

aussi, si le jeton auth doit être envoyé, ajouter ceci aussi

"Access-Control-Allow-Credentials" -> "true"

aussi, au client, mettre withCredentials

cela provoque 2 requêtes envoyées au serveur, une avec OPTIONS . Le cookie d'Auth n'est pas envoyé avec, donc besoin de traiter les auth externes.

6
répondu bsr 2013-09-06 00:55:16

je faisais face à un problème en appelant la ressource cross origin en utilisant ajax à partir de chrome.

j'ai utilisé node JS et le serveur http local pour déployer mon application node js.

j'ai été prise en réponse à l'erreur, lorsque j'accède à la croix-origin resource

j'ai trouvé une solution,

1) j'ai ajouté le code ci-dessous à mon application.fichier js

res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");

2) dans ma page html appelée cross origin ressource utilisant $.getJSON();

$.getJSON("http://localhost:3000/users", function (data) {
    alert("*******Success*********");
    var response=JSON.stringify(data);
    alert("success="+response);
    document.getElementById("employeeDetails").value=response;
});
3
répondu Chaitanya 2014-10-18 17:17:33

ajoutez ceci à votre serveur NodeJS ci-dessous importations:

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
1
répondu Ryan Cocuzzo 2018-04-17 19:47:55

j'ai finalement eu la réponse pour apache Tomcat8

vous devez éditer le tomcat web.fichier xml.

probablement il sera dans le dossier webapps,

sudo gedit /opt/tomcat/webapps/your_directory/WEB-INF/web.xml

trouver et éditer

<web-app>


<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>


<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>



</web-app>

cela permettra à Access-Control-Allow-Origin tous les hôtes. Si vous avez besoin de changer tous les hôtes uniquement sur votre hôte, vous pouvez modifier le

<param-name>cors.allowed.origins</param-name>
<param-value>http://localhost:3000</param-value>

au-dessus du code de * à votre http://your_public_IP ou http://www.example.com

vous pouvez vous référer ici Tomcat filtre documentation

Merci

1
répondu Shinto Joseph 2018-05-02 09:10:02

utiliser le type de données: "jsonp", fonctionne pour moi.

   async function get_ajax_data(){

       var _reprojected_lat_lng = await $.ajax({

                                type: 'GET',

                                dataType: 'jsonp',

                                data: {},

                                url: _reprojection_url,

                                error: function (jqXHR, textStatus, errorThrown) {

                                    console.log(jqXHR)

                                },

                                success: function (data) {

                                    console.log(data);



                                    // note: data is already json type, you just specify dataType: jsonp

                                    return data;

                                }

                            });





 } // function               
0
répondu hoogw 2018-09-28 19:18:29

si vous avez 403 après cela s'il vous plaît réduire les filtres dans le WEB.XML tomcat config à la suivante:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
</filter>
0
répondu Farbod Aprin 2018-09-29 11:43:39
In router.js just add code before calling get/post methods. It works for me without errors.

//Importing modules @Brahmmeswar
const express = require('express');
const router = express.Router();

const Contact = require('../models/contacts');

router.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
  });
0
répondu Brahmmeswara Rao Palepu 2018-10-02 04:13:11