跨域的解决方案
跨域的五种解决方案
- 什么是同源
- 如果两个页面的协议域名和端口都相同 则两个页面具有相同的源
- 同源策略
- 如果不是同源就会跨域 如果请求不进行处理就会报错
Access-control-Allow-xxx
- 如果同源 才会传给
AJAX
的success
函数 - 跨域可以发送出去 服务器可以接收 但是会丢掉数据 不给信息
- 如果不是同源就会跨域 如果请求不进行处理就会报错
1. JSONP
- 直接通过
script
标签的src
属性获取script
导入的文件会立即执行- 注意 引入的
script
标签要在函数定义的后面
- 缺点是只能是
GET
请求1
2
3
4
5
6
7
8
9
10
11
12# aaa.js // 可以服务器上触发,这里本地测试
aaa({
name: 'zs',
age: 10
})
# index.html
<script>
function aaa(data) {
console.log(data); // {name: 'zs', age: 10}
}
</script>
<script src="aaa.js?callback=aaa"></script>
2. CORS
- 支持
GET
和POST
,不兼容IE
- 服务端在响应数据给浏览器的时候 ,在响应头添加一些字段,浏览器就会允许跨域了
- 例如
nodejs
的express
框架的CORS
1
2
3
4
5
6
7
8
9//express
app.all('*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'X-Requested-With');
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Headers', 'mytoken');
next();
});
3. Nginx转发
- 一般直接在服务器上配置,将请求直接转发到同源的地方就不会跨域了
1
2
3
4
5
6
7
8
9
10
11https://www.cnblogs.com/ysocean/p/9392908.html
server{
//监听9099端口
listen 9099;
// 本地的域名是localhost
server_name localhost;
//凡是localhost:9099/api这个样子的,都转发到真正的服务端地址http://baidu.com
location ^~ /api {
proxy_pass http://baidu.com;
}
}
4. 本地反向代理
- 本地开发阶段才能使用
1
2
3
4
5
6
7
8
9
10
11
12// https 需要配置 secure headers(这个就是target的地址)
proxy: {
'/api': {
target: 'https://xxx.com',
changeOrigin: true,
// pathRewrite: {'^/api': ''} // 如果后端的请求路径也有 api 就需要重写
secure: false,
headers: {
Referer: 'https://xxx.com',
},
},
},
5. k8s Ingress
Ingress
为外部访问集群提供了一个 统一 入口,避免了对外暴露集群端口- 功能类似
Nginx
,可以根据域名、路径把请求转发到不同的Service
- 可以配置
https
- 如果是云服务商,会自动给你配置
1 | apiVersion: networking.k8s.io/v1 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LiuYuanhua!
评论