XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
Čítal som o ajaxových požiadavkách medzi doménami a chápem základný bezpečnostný problém. V mojom prípade sú lokálne spustené 2 servery a rád by som počas testovania povolil cross domain požiadavky.
localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server
Vydávam ajaxovú požiadavku na localhost:8080 - GAE server
, zatiaľ čo moja stránka sa načítava z node servera. Čo je najjednoduchšie a najbezpečnejšie ( Nechcem spúšťať chrome s voľbou disable-web-security
). Ak mám zmeniť 'Content-Type'
, mám to urobiť na node serveri? Ako?
Keďže sú spustené na rôznych portoch, sú to rôzne JavaScripty origin
. Nezáleží na tom, že sú na tom istom počítači/názve hostiteľa.
Na serveri (localhost:8080) musíte povoliť CORS. Pozrite si túto stránku: http://enable-cors.org/
Jediné, čo musíte urobiť, je pridať na server hlavičku HTTP:
Access-Control-Allow-Origin: http://localhost:3000
Alebo, pre zjednodušenie:
Access-Control-Allow-Origin: *
Na vyriešenie tohto problému musíte povoliť CORS
nastavte ho v hlavičkách odpovede, ako napr.
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);
použite CORS middleware, ako napríklad
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();
}
a použite ho prostredníctvom
app.configure(function() {
app.use(allowCrossDomain);
//some other code
});
Tu sú dva referenčné odkazy
Prijímam odpoveď @Rocket hazmat'pretože ma priviedla k riešeniu. Na serveri GAE som skutočne potreboval nastaviť hlavičku. Musel som nastaviť tieto
"Access-Control-Allow-Origin" -> "*"
"Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"
nastavenie iba "Access-Control-Allow-Origin"
dalo chybu
Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.
Tiež, ak je potrebné poslať auth token, pridajte aj toto
"Access-Control-Allow-Credentials" -> "true"
V klientovi tiež nastavte withCredentials
To spôsobí, že sa na server odošlú 2 požiadavky, jedna s OPTIONS
. Auth cookie sa s ním neposiela, preto je potrebné ho spracovať mimo auth.