Access-Control-Allow-Origin不允许源http:// localhost:3000
XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
我阅读了关于跨域的Ajax请求,并了解了底层的安全问题。 就我而言,2台服务器在本地运行,并且喜欢在testing期间启用跨域请求。
localhost:8080 - Google Appengine dev server localhost:3000 - Node.js server
我正在向localhost:8080 - GAE server
发出一个ajax请求,而我的页面是从节点服务器加载的。 什么是最简单的,最安全的(不想用disable-web-security
选项启动chrome)。 如果我必须更改'Content-Type'
,我应该在节点服务器上执行吗? 怎么样?
由于它们在不同的端口上运行,因此它们是不同的JavaScript origin
。 它们在同一台机器/主机名上并不重要。
您需要在服务器上启用CORS(localhost:8080)。 看看这个网站: http : //enable-cors.org/
所有你需要做的是添加一个HTTP头到服务器:
Access-Control-Allow-Origin: http://localhost:3000
或者,为了简单:
Access-Control-Allow-Origin: *
你必须启用CORS来解决这个问题
如果你的应用程序是用简单的node.js创build的
把它设置在你的响应头文件中
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);
如果您的应用程序是用快速框架创build的
使用像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 });
这里有两个参考链接
- 如何对允许-CORS-在-EXPRESS-的NodeJS
- 跳入节点 – js-very-first-app #参见Ajax部分
如果您需要在Chrome浏览器中快速解决ajax请求,该Chrome插件会自动允许您通过添加适当的响应标头来访问任何来源的任何网站
Chrome扩展程序Allow-Control-Allow-Origin:*
我接受@火箭hazmat的答案,因为它导致我的解决scheme。 确实在我需要设置标题的GAE服务器上。 我必须设置这些
"Access-Control-Allow-Origin" -> "*" "Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"
只设置"Access-Control-Allow-Origin"
出错
Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.
另外,如果需要发送authentication令牌,也要添加
"Access-Control-Allow-Credentials" -> "true"
另外,在客户端,使用withCredentials
设置
这导致2个请求发送到服务器,一个与OPTIONS
。 身份validationcookie不会随其发送,因此需要对待外部身份validation。
我在使用chrome中的ajax调用跨源资源时遇到了问题。
我已经使用节点js和本地http服务器来部署我的节点js应用程序。
当我访问跨源资源时,我得到错误响应
我find了一个解决scheme,
1)我已经将下面的代码添加到我的app.js文件
res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With");
2)在我的HTML页面中使用$.getJSON();
来调用cross origin资源$.getJSON();
$.getJSON("http://localhost:3000/users", function (data) { alert("*******Success*********"); var response=JSON.stringify(data); alert("success="+response); document.getElementById("employeeDetails").value=response; });