Access-Control-Allow-Origin不允许使用Origin <origin>

bsr*_*bsr 151 javascript ajax google-chrome node.js cors

XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin. 
Run Code Online (Sandbox Code Playgroud)

我阅读了有关跨域ajax请求的信息,并了解了基础安全问题.就我而言,2台服务器在本地运行,并且喜欢在测试期间启用跨域请求.

localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server
Run Code Online (Sandbox Code Playgroud)

我正在localhost:8080 - GAE server从节点服务器加载我的页面时发出一个ajax请求.什么是最简单,最安全的(不想用disable-web-security选项启动chrome ).如果我必须改变'Content-Type',我应该在节点服务器上做吗?怎么样?

Roc*_*mat 167

由于它们在不同的端口上运行,因此它们是不同的JavaScript origin.它们在同一台机器/主机名上并不重要.

您需要在服务器上启用CORS(localhost:8080).看看这个网站:http://enable-cors.org/

您需要做的就是向服务器添加HTTP标头:

Access-Control-Allow-Origin: http://localhost:3000
Run Code Online (Sandbox Code Playgroud)

或者,为简单起见:

Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

  • 为了清楚起见,当说你需要"向服务器添加HTTP头"时,这意味着给定的`Access-Control-Allow-Origin`头需要是服务器发送的HTTP响应的添加头. .此标头需要是**服务器响应的一部分,它不需要是客户端请求的一部分**.具体而言,在客户端发出您想要的实际请求之前,浏览器会在其之前发送"OPTIONS"请求,如果服务器对该"OPTIONS"请求的响应不包含标头,则浏览器将不会发送您所需的请求. (9认同)
  • 谢谢你的回复.只是想强调在这里使用'*'作为值的安全含义.这允许所有来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin似乎第一个例子在最少访问方面是最好的.有关如何使用多个域执行此操作的详细信息:/sf/answers/129533771/ (4认同)
  • 请务必阅读enable-cors.org 上有关后端服务器的相关提示。 (2认同)

小智 59

如果您需要在Chrome中快速解决ajax请求,此Chrome插件会自动允许您通过添加正确的响应标头来访问任何来源的任何网站

Chrome Extension Allow-Control-Allow-Origin:*

  • 如果这是一个很好的解决方案,首先不会发明CORS.将此标头应用于任何主机会禁用CORS保护并使您暴露于恶意脚本,而不仅仅是您的恶意脚本.如果您的银行帐户突然空了,请不要感到惊讶. (11认同)
  • 我不知道为什么你没有得到更多的赞成.这对于使用Chrome的localhost进行开发是最不具侵入性的. (4认同)
  • 这应该是最佳答案!特别是在本地主机方面。 (2认同)

mit*_*esh 47

您必须启用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);
Run Code Online (Sandbox Code Playgroud)

如果您的应用程序是使用快速框架创建的

使用像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();
}
Run Code Online (Sandbox Code Playgroud)

并通过申请

app.configure(function() {
    app.use(allowCrossDomain);
    //some other code
});    
Run Code Online (Sandbox Code Playgroud)

这是两个参考链接

  1. 如何对允许-CORS-在-EXPRESS-的NodeJS
  2. diving-into-node-js-very-first-app #see Ajax部分

  • 那么我是唯一一个得到 `app.configure()` 不是函数错误的人吗? (2认同)
  • @PrameshBajrachaya我没有包含“app.configure”部分——只有“app.use(allowCrossDomain)”,它对我有用。 (2认同)

小智 9

在 router.js 中,只需在调用 get/post 方法之前添加代码。它对我有用,没有错误。

//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();
  });
Run Code Online (Sandbox Code Playgroud)


bsr*_*bsr 8

我接受@Rocket hazmat的回答,因为它引导我找到解决方案.确实在GAE服务器上我需要设置标题.我不得不设置这些

"Access-Control-Allow-Origin" -> "*"
"Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"
Run Code Online (Sandbox Code Playgroud)

设置只"Access-Control-Allow-Origin" 给出了错误

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.
Run Code Online (Sandbox Code Playgroud)

此外,如果需要发送身份验证令牌,也请添加此令牌

"Access-Control-Allow-Credentials" -> "true"
Run Code Online (Sandbox Code Playgroud)

此外,在客户端,设置 withCredentials

这导致2个请求发送到服务器,一个用于OPTIONS.Auth cookie不与它一起发送,因此需要处理外部auth.


Aka*_*iya 8

如果您使用的是 express,则可以使用 cors 中间件,如下所示:

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

app.use(cors())
Run Code Online (Sandbox Code Playgroud)


小智 5

在 chrome 中使用 ajax 调用跨源资源时遇到问题。

我已经使用 node js 和本地 http 服务器来部署我的 node js 应用程序。

我在访问跨源资源时收到错误响应

我找到了一个解决方案,

1)我已将以下代码添加到我的 app.js 文件中

res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
Run Code Online (Sandbox Code Playgroud)

2) 在我的 html 页面中使用 $.getJSON();

$.getJSON("http://localhost:3000/users", function (data) {
    alert("*******Success*********");
    var response=JSON.stringify(data);
    alert("success="+response);
    document.getElementById("employeeDetails").value=response;
});
Run Code Online (Sandbox Code Playgroud)