跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域;
下面我用express框架来进行演示:server.js:
const express = require('express')
const app = express()
app.use(express.static(__dirname))
app.listen(90)
const app2 = express()
//91端口的服务 返回数据
app2.get("/",function(req,res){
res.send("你好")
})
app2.listen(91)
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>大家好</h1>
</body>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
axios.get('http://localhost:91/').then(res=>console.log(res))
</script>
</html>
90端口显示的是我们的index.html页面,91端口是我们的数据,现在我想通过axios从90端口拿到91端口的数据,结果浏览器告诉我们发生了跨域(端口不同)
这时候我们要想解决办法:
CORS
修改响应头
浏览器告诉我们没有 Access-Control-Allow-Origin请求头,那么我们就加一个嘛。
const express = require("express");
const app = express();
app.use(express.static(__dirname));
app.listen(90);
const app2 = express();
//91端口的服务 返回数据
app2.get("/", function (req, res) {
res.header("Access-Control-Allow-Origin", "*");
res.send("你好");
});
app2.listen(91);
这样我们就可以拿到数据
JSONP
想用jsonp,我们就要了解一个现象:我们通过href或者src去请求下来的脚本或者css文件或者image再或者视频文件等都不存在跨域问题,只有通过ajax请求下来的数据才会发生跨域问题
思路:把要发送的数据放在函数中,在客户端通过调用函数来获得数据。来看代码:server.js
const express = require("express");
const app = express();
app.use(express.static(__dirname));
app.listen(90);
const app2 = express();
//91端口的服务 返回数据
app2.get("/", function (req, res) {
var name = req.query.callback;
res.send(name+'("hhh")');
});
app2.listen(91);
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>大家好</h1>
</body>
<script>
function f(data) {
console.log(data)
}
</script>
<script src="http://localhost:91?callback=f"></script>
</html>
这里边 req.query.callback,req.query.内容,这个内容就是http://localhost:91? 后边的内容。比如我们在服务端传的是callback,那么我们接受时就用?callback=aa(这个名字就随便了)。TIPS:我们引入时src要在函数的下边。
nginx
这个是我做的uni-app项目部署到我的服务器上时,遇到的问题。我只想把前端放到我的服务器上,后端部署到了另外一个项目,这就涉及到了跨域。
// api请求前缀
// #ifdef H5
webUrl:'/api',
我使用了nginx来做代理:
location /api {
proxy_pass https:/xxx.xxx.cn/api/v1;
}
当我们请求的路径为/api时,我们会让设置的https:/xxx.xxx.cn/api/v1来代替请求。