这是一个老生常谈的问题了,几乎面试必问吧,譬如问到什么是跨域啊?怎么解决跨域啊?那种方案比较好啊?因为的确是日常开发中不可避免的问题,我自己也经常会遇到,但每次把问题了解决后都没好好的总结,犹如过眼烟云,所以下面我从自己的角度来总结一下这几个问题。
一、什么是跨域
URL的组成:
协议 + 子域名+主域名+端口号+资源地址
当A 页面 URL 的 协议、子域名、主域名、端口号 和 B URL 的 协议、子域名、主域名、端口号有一个不同时再相互请求就会产生跨域问题 ,浏览器的XMLHttpRequest 会自动屏蔽掉不允许发送到服务端。只有当他们都相同时就是同源,浏览器只支持同源策略下相互请求,这是一个很安全的理念,保证了用户信息的安全,防止恶意的网址窃取数据。
二、解决方案
1. cors请求(推荐指数5颗星)
cors需要浏览器和服务器同时支持,目前ie10以下不支持。
使用
客户端不需要什么改造。
服务器:只需要设置2个服务器头。
需要在header 中设置Access-Control-Allow-Origin:*;后面有个*星号,*就是所有域都可以访问
可以支持多种请求方式,不限于get
2.jsonp (推荐指数4颗星)
基本原理就是通过动态创建script标签,然后利用src属性进行跨域。
这么说比较模糊,我们来看个例子:
// 定义一个函数
function f1(fata) {
console.log(data);
};// 创建一个脚本,并且告诉后端回调函数名叫fun
var body = document.getElementsByTagName('body')[0];
var script = document.gerElement('script');
script.type = 'text/javasctipt';
script.src = 'demo.js?callback=f1';
body.appendChild(script);
这部分是jsonp 底层封装实现,如果A页面请求B地址 不同源时,会把B地址转换成script 的src 来解决,避免使用XMLHttpRequest 不同源跨域问题
f1({"name": "name"})
分析一下用了jsonp返回的数据结构,会在json串外面包一层 f1( ),根据callback参数的值会直接执行。所以就执行了事先定义好的fun函数了,并且把数据传入了进来。callback不指定时会随机生成一个方法名。
客户端设置:
服务端设置:
参考文章
https://www.cnblogs.com/starof/p/6434745.html