XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
He leído sobre las peticiones ajax de dominio cruzado, y entiendo el problema de seguridad subyacente. En mi caso, 2 servidores se ejecutan localmente, y como para permitir las solicitudes de dominio cruzado durante las pruebas.
localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server
Estoy emitiendo una petición ajax a localhost:8080 - servidor GAE
mientras mi página se carga desde el servidor de nodos. Cuál es la forma más fácil y segura (no quiero iniciar Chrome con la opción disable-web-security
). Si tengo que cambiar 'Content-Type'
, ¿debo hacerlo en el servidor de nodos? ¿Cómo?
Dado que se ejecutan en diferentes puertos, son diferentes origen
de JavaScript. No importa que estén en la misma máquina/nombre de host.
Necesitas habilitar CORS en el servidor (localhost:8080). Consulte este sitio: http://enable-cors.org/
Todo lo que tienes que hacer es añadir una cabecera HTTP al servidor:
Access-Control-Allow-Origin: http://localhost:3000
O, para simplificar:
Access-Control-Allow-Origin: *
Tienes que habilitar CORS para resolver esto
configúralo en tus cabeceras de respuesta como
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);
utilice un middleware CORS como
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();
}
y aplíquelo a través de
app.configure(function() {
app.use(allowCrossDomain);
//some other code
});
Aquí hay dos enlaces de referencia
Acepto la respuesta de @Rocket hazmat'ya que me llevó a la solución. Efectivamente era en el servidor GAE donde tenía que poner la cabecera. Tuve que poner esto
"Access-Control-Allow-Origin" -> "*"
"Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"
sólo la configuración de `"Access-Control-Allow-Origin"dio error
Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.
Además, si es necesario enviar el token de autenticidad, añada esto también
"Access-Control-Allow-Credentials" -> "true"
Además, en el cliente, establece "withCredentials".
esto hace que se envíen 2 peticiones al servidor, una con OPTIONS
. La cookie de autenticidad no se envía con ella, por lo que hay que tratarla fuera de la autenticidad.