Access-Control-Allow-Origin </origin>不允许Origin <origin>

时间:2013-09-05 17:50:28

标签: javascript node.js ajax google-chrome cors

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

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

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

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

16 个答案:

答案 0 :(得分:143)

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

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

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

Access-Control-Allow-Origin: http://localhost:3000

或者,为简单起见:

Access-Control-Allow-Origin: *

答案 1 :(得分:51)

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

Chrome Extension Allow-Control-Allow-Origin: *

答案 2 :(得分:43)

您必须启用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);

如果您的应用是使用快速框架

创建的

使用像

这样的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
});    

以下是两个参考链接

  1. how-to-allow-cors-in-express-nodejs
  2. diving-into-node-js-very-first-app#查看Ajax部分

答案 3 :(得分:7)

我接受@Rocket hazmat的答案,因为它引导我找到解决方案。确实在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.

此外,如果需要发送auth令牌,也可以添加

"Access-Control-Allow-Credentials" -> "true"

此外,在客户端,设置withCredentials

这会导致2个请求发送到服务器,其中一个请求OPTIONS。 Auth cookie不随身携带,因此需要在外部认证。

答案 4 :(得分:3)

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

我使用了节点js和本地http服务器来部署我的节点js app。

当我访问跨源资源

时,我收到了错误响应

我找到了一个解决方案,

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

res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");

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

答案 5 :(得分:3)

In router.js just add code before calling get/post methods. It works for me without errors.

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

答案 6 :(得分:2)

如果之后获得403,请减少WEB.XML tomcat配置中的过滤器至以下内容:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
</filter>

答案 7 :(得分:2)

如果使用的是Express,则可以按以下方式使用cors中间件:

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

app.use(cors())

答案 8 :(得分:1)

将此添加到导入下面的NodeJS服务器:

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

答案 9 :(得分:1)

我终于得到了apache Tomcat8的答案

您必须编辑tomcat web.xml文件。

可能它将在webapps文件夹中,

sudo gedit /opt/tomcat/webapps/your_directory/WEB-INF/web.xml

找到并编辑它

<web-app>


<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>


<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>



</web-app>

这将允许所有主机的Access-Control-Allow-Origin。 如果您需要将其从所有主机更改为仅主机,则可以编辑

<param-name>cors.allowed.origins</param-name>
<param-value>http://localhost:3000</param-value>

以上代码从*到您的http://your_public_IPhttp://www.example.com

您可以在此处参考Tomcat filter documentation

由于

答案 10 :(得分:1)

如果有人在寻找解决方案,如果您使用的是express,这里是快速解决方案。

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

1)使用npm npm install cors --save

安装cors

2)导入[需要] const cors = require('cors')

3)将其用作中间件app.use(cors())

了解详情insatll and usage of cors 。 就是这样,希望它能起作用。

答案 11 :(得分:0)

使用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               

答案 12 :(得分:0)

嗨,这是解决节点中CORS问题的方法,只需在Node.js(或服务器文件)中的服务器“ api”端添加这些行, 在确保安装“ cors”之前,

    const express = require('express');
    const app = express();
    app.use(express.json());
    var cors = require('cors');
    app.use(cors());

答案 13 :(得分:0)

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文件中。

答案 14 :(得分:-1)

对于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");

答案 15 :(得分:-3)

如果您使用的是Google Chrome浏览器,请尝试安装此插件:

https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi/related