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

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',是否应该在节点服务器上进行更改怎么样?

米亚卡卡西2020/03/24 15:16:30

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

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

番长2020/03/24 15:16:30

我终于得到了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过滤器文档

谢谢

古一LEY2020/03/24 15:16:30

对于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");
泡芙2020/03/24 15:16:30

如果之后获得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>
米亚2020/03/24 15:16:30

将此添加到导入下面的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();
});
猴子村村2020/03/24 15:16:30

在使用Chrome中的Ajax调用跨源资源时,我遇到了一个问题。

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

访问跨源资源时出现错误响应

我找到了一个解决方案,

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;
});
理查德小小2020/03/24 15:16:30

我接受@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.

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

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

另外,在客户处设定 withCredentials

这会导致2个请求发送到服务器,其中一个带有OPTIONS身份验证cookie不随其一起发送,因此需要处理外部身份验证。

伽罗2020/03/24 15:16:30

如果您需要在Chrome中快速解决Ajax请求,则此chrome插件会自动添加适当的响应标头,使您可以从任何来源访问任何网站

Chrome扩展程序允许控制允许来源:*