什么是跨域?
跨域是指浏览器不能再执行其他网站的脚本。它是由浏览器同源策略造成的,是浏览器施加的安全限制。
同源是指:域名(domain)、协议(protocol)、端口(port)。
URI | 说明 | 是否跨域 |
http://www.LuckyFBB.com/a.js http://www.Lucky.cm/b.js | 不同域名 | 是 |
http://www.LuckyFBB.com/src/a.js http://www.Lucky.cm/script/b.js | 同域名下不同文件 | 否 |
http://www.LuckyFBB.com:8080/a.js http://www.Lucky.cm/b.js | 同域名下不同端口 | 是 |
http://www.LuckyFBB.com/a.js https://www.LuckyFBB.com/b.js | 同域名下不同协议 | 是 |
http://www.LuckyFBB.com/a.js http:/80.90.10.75/b.js | 域名和域名对应的ip | 是 |
http://www.LuckyFBB.com/a.js http://script.LuckyFBB.com/b.js | 主域名相同 子域名不同 | 是 |
http://www.LuckyFBB.com/a.js https://LuckyFBB.com/b.js | 同一域名,不同二级域名 | 是 |
如果非同源就会受到以下限制:
- cookie无法读取
- dom无法获得
- ajax请求不能发送
如何解决?
JSONP
JSONP是指JSON Padding,JSONP是一种非官方跨域数据交换协议,由于script的src属性可以跨域请求,所以JSONP利用的就是浏览器的这个'漏洞',需要通信时,动态插入一个script标签。请求地址一般带有一个callback参数。
JSONP虽然简单易用,但是只能进行get请求。
window.name
window.name的美妙之处:name值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的name值。
window.postMessage
window.postMessage是一个安全的跨源通信的方法。一般情况下,当且仅当执行脚本的页面是相同协议(通常是http)、相同端口(http默认使用80端口)和相同的host(两个页面的document.domain的值相同)时,才允许同业面上的脚本互相访问。