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

我读过跨域ajax请求,了解底层的安全问题。在我的例子中,两台服务器在本地运行,并且喜欢在测试期间启用跨域请求。

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

当我的页面从节点服务器加载时,我发出ajax请求到localhost:8080 - GAE服务器。什么是最简单,最安全的(不想启动chrome禁用web-security选项)。如果我必须改变“内容类型”,我应该在节点服务器上这样做吗?如何?


当前回答

你必须让CORS来解决这个问题

如果你的应用是用简单的node.js创建的

在你的响应头中设置它

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

如果你的应用是用express framework创建的

使用CORS中间件

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

并通过

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

这里有两个参考链接

how-to-allow-cors-in-express-nodejs dive -into-node-js-very-first-app #参见Ajax部分

其他回答

你必须让CORS来解决这个问题

如果你的应用是用简单的node.js创建的

在你的响应头中设置它

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

如果你的应用是用express framework创建的

使用CORS中间件

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

并通过

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

这里有两个参考链接

how-to-allow-cors-in-express-nodejs dive -into-node-js-very-first-app #参见Ajax部分

router.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "*");
res.header("Access-Control-Allow-Headers", "*");
next();});

将此添加到您从前端调用的路由中。 除 如果你调用http://localhost:3000/users/register,你必须在路由所在的后端.js文件中添加这段代码。

我遇到了这个问题,我遵循了php方面(设置头部)和react (axios withcredential =true)的所有推荐代码片段,但我无法摆脱这个错误。

在php中我有:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");

最后,我注意到这些头文件没有出现在响应中。

响应应该是这样的:

显然,出于某种原因,我的vscode开始将文件保存为UTF8-BOM。结果,报头立即被发送,所有后续的header(..)语句都被忽略,因为报头已经被发送。

有两个有用的php命令可以检查这个问题:headers_list()和headers_sent()

notepad++是很好的查看文件编码,并切换到不同的编码:

使用dataType: 'jsonp',为我工作。

   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               

如果你正在使用express,你可以使用cors中间件如下所示:

var express = require('express')
var cors = require('cors')
var app = express()

app.use(cors())