㈠定义
⑴跨域,是指浏览器不能执行其他网站的脚本。
⑵它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。
㈡造成跨域的场景
①协议不同 域名不同 端口不同
②什么是协议,域名,端口?
解释:假如一个网址是 http://baidu.com:8080?user=name&pwd=password
http:// 是协议
baidu.com 是域名(注意:前面加上“wwww”即www.baidu.com不是域名)
8080 是端口
user=name&pwd=password 是地址带的参数
⑴域名不同(域名访问和IP访问也造成跨域)
http://www.baidu.com
http://www.case.com
⑵子域名不同
http://www.example.com
http://a.example.com
⑶端口不同
http://www.example.com(:80)
http://www.example.com(:8080)
⑷协议不同
http://www.example.com
https://www.example.com
㈢实现跨域访问的方式
⑴JSONP跨域
⑵iFrame跨域
⑶协议跨域 (跨域资源访问CORS)
㈣JSONP跨域
⑴原理: 利用script标签src可以用外链的功能。
即:<script src="http://www.external.com/link/action.js"></script>
⑵必要条件:
1、 externalLink返回的内容必须为一段可执行脚本
2、 当前域同外域约定好脚本执行的函数名
(jsonpCallback)
3、 传入函数的实参data
⑶格式如下
action.js content:
jsonpCallback(data);
data type: number| string | boolean | object
当前域声明函数:
jsonpCallback(result) {
/* code statement */
}
㈤iFrame跨域
iframe存在页面嵌套关系,即会有父页面(outer.html)和子页面(inner.html)。
这样就存在父页面使用子页面的数据,子页面使用父页面数据的情况。
1. 非一个根域:
需要一个中间页面做代理,通过window.name获取不同域页面下的数据.
原理: iframe加载不同的src,window.name是可以被传递的。
父页面: lichenfan.com
子页面: innomachine.com.cn
父页面--->子页面数据
1) load 子页面,子页面设置window.name.
2) load 代理页面,代理页面和父页面同域。
子页面--->父页面数据
load 子页面,给子页面的页面路径修改不同的hash
子页面定义window.onhashchange的事件,触发获取数据。
2. 同一个根域:
www.lichenfan.com 和 sen.lichenfan.com
在当前的文档下设置 document.domain = "lichenfan.com" 即可。
父页面--->子页面数据
window.iframe.contentWindow.xx;
子页面--->父页面数据
window.parent.xxx;
㈥协议跨域
被访问域名在webservice配置跨域访问的header即可,
会用到两个header。
Access-Control-Allow-Origin: * | 访问域名;
Access-Control-Allow-Methods: GET | POST | PUT | DELETE;
参考:https://zhuanlan.zhihu.com/p/24632196