首先了解下浏览器的同源策略 同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,三者有一个不相同那么便非同源
跨域问题解决方式
1.
第一种:通过服务端代理请求。
如PHP,服务端语言php是没有跨域限制的。
- 让服务器去别的网站获取内容然后返回页面。
第二种:jsonp跨域
jsonp跨域就是利用script标签的跨域能力请求资源
- 既然叫jsonp,显然目的还是json,而且是跨域获取
- 利用js创建一个script标签,把json的url赋给script的scr属性,把这个script插入到页面里,让浏览器去跨域获取资源
- callback是页面存在的回调方法,参数就是想得到的json
- 回调方法要遵从服务端的约定一般是用 callback 或者 cb
- 注意:jsonp只针对get请求
第三种:CORS 跨域资源共享(xhr2)
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)
- 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制
- 整个CORS通信过程,都是浏览器自动完成,不需要用户参与
- 对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样
- 实现CORS通信的关键是服务器,只要服务器实现了CORS接口,就可以跨源通信
实现CORS并不难,只需服务端做一些设置即可:如
<?php header("Access-Control-Allow-Origin:*");?> // 允许任何来源注意:IE10以下不支持CORS
nginx代理跨域
nginx服务器来做代理,躲避跨域
5.
document.domain + iframe跨域
此方案仅限主域相同,子域不同的跨域应用场景
1.)父窗口:(http://www.domain.com/a.html)
<iframe id="iframe" src="http://child.domain.com/b.html"></iframe>
<script>
document.domain = 'domain.com';
var user = 'admin';
</script>
2.)子窗口:(http://child.domain.com/b.html)
document.domain = 'domain.com';
// 获取父窗口中变量
alert('get js data from parent ---> ' + window.parent.user);