[英]Origin <origin> is not allowed by Access-Control-Allow-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'
,我应该在节点服务器上进行吗? 如何?
由于它们在不同的端口上运行,它们是不同的 JavaScript origin
。 它们在同一台机器/主机名上并不重要。
您需要在服务器 (localhost:8080) 上启用 CORS。 看看这个网站: http ://enable-cors.org/
您需要做的就是向服务器添加一个 HTTP 标头:
Access-Control-Allow-Origin: http://localhost:3000
或者,为简单起见:
Access-Control-Allow-Origin: *
如果您的服务器尝试设置 cookie 并且您使用withCredentials = true
,请不要使用“*”
响应凭据请求时,服务器必须指定域,并且不能使用通配符。
如果您需要在 Chrome 中快速解决 ajax 请求,这个 chrome 插件自动允许您通过添加正确的响应标头从任何来源访问任何网站
您必须启用 CORS 才能解决此问题
将其设置在您的响应标头中,例如
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
});
这里有两个参考链接
我接受@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
。 Auth cookie 不会随它一起发送,因此需要处理外部身份验证。
在 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();
});
如果你使用 express,你可以使用 cors 中间件如下:
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
我在使用 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");
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;
});
将其添加到您的 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();
});
如果之后得到 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>
万一有人在寻找解决方案,如果您在这里使用 express 是快速解决方案。
const express = require('express')
const cors = require('cors')
const app = express()
1) 使用 npm npm install cors --save
2) 导入它 [require] const cors = require('cors')
3) 将其用作中间件app.use(cors())
有关详细信息insatll 和 cors 的用法。 就是这样,希望它有效。
我终于得到了 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_IP或http://www.example.com
你可以参考这里Tomcat过滤器文档
谢谢
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,使用它来设置标题。
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");
嗨,这是解决节点中 CORS 问题的方法只需在 Node.js 的服务器“api”端添加这些行(或您的服务器文件),在此之前确保安装“cors”
const express = require('express');
const app = express();
app.use(express.json());
var cors = require('cors');
app.use(cors());
如果您的服务器是server=express()
只需将server.use(cors())
添加到下一行。 例如:
server.js
const express = require('express')
const cors = require('cors')
server=express()
server.use(cors())
server.get('/',(req,res)=>{
res.send({"name":"aakash","name2":"aakash4dev"})
})
server.listen(3000)
index.html
<script>
fetch('http://localhost:3000/')
.then(res=> res.json())
.then(data => console.log(data))
</script>
使用 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
如果您使用快递,
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
如果您使用的是app.use(express.json());
服务器文件中的代码行来解析带有 JSON 有效负载的传入请求,并且基于 body-parser,请记住在使用app.use(cors())
代码行之后使用它。 否则,可能会出现安全问题。 CORS
install cors package
const cors = require('cors');
app.use(cors());
如果您使用的是 Google Chrome,请尝试安装此插件:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.