XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
我读过跨域ajax请求,了解底层的安全问题。在我的例子中,两台服务器在本地运行,并且喜欢在测试期间启用跨域请求。
localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server
当我的页面从节点服务器加载时,我发出ajax请求到localhost:8080 - GAE服务器。什么是最简单,最安全的(不想启动chrome禁用web-security选项)。如果我必须改变“内容类型”,我应该在节点服务器上这样做吗?如何?
我遇到了这个问题,我遵循了php方面(设置头部)和react (axios withcredential =true)的所有推荐代码片段,但我无法摆脱这个错误。
在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");
最后,我注意到这些头文件没有出现在响应中。
响应应该是这样的:
显然,出于某种原因,我的vscode开始将文件保存为UTF8-BOM。结果,报头立即被发送,所有后续的header(..)语句都被忽略,因为报头已经被发送。
有两个有用的php命令可以检查这个问题:headers_list()和headers_sent()
notepad++是很好的查看文件编码,并切换到不同的编码:
如果有人正在寻找解决方案,如果您正在使用express,这里是快速解决方案。
const express = require('express')
const cors = require('cors')
const app = express()
1)使用NPM install cors—save
2) import it [require] const cors = require('cors')
3)使用它作为中间件app.use(cors())
详细的安装和使用cors。
就是这样,希望它能起作用。
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文件中添加这段代码。
如果您的服务器是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>