一、为什么需要JS跨域
假设我们构建了一个网上商城www.xxx.com,出于对用户账号安全性的考虑,我们将用户登录统一到auth.xxx.com的子域下验证。当一个未登录用户浏览商品以后点击购买,为了提高网站的用户体验,我们想提供一个无刷新的登录入口。我们立刻想到使用AJAX实现无刷新的数据交互,可当我们实际使用AJAX向auth.xxx.com提交数据的时候,JS却出现错误提示,我们没有权限进行此操作,因为XM [HTTPRequest的实现要遵循浏览器的安全模型的同源策略规则,JS只能往自己的同源(同协议、同域名、同端口)发送XMLHTTPRequest请求,所以我们无法往子域发送AJAX请求。]
解决此问题的通常做法是由auth.xxx.com提供接口,在www.xxx.com的域下做一个服务端代理。但随着业务的发展,我们又有a.xxx.com,b.xxx.com...等等都需要到auth.xxx.com做登录验证,那么我们需要在每一个子域下都有一个服务端的Proxy,值得庆幸的是这些子域都是我们自己的,对服务器上的程序有控制权,所以操作起来还是可行的。然而随着业务的继续发展,我们有越来越多的合作伙伴,现在我们要与他们实现部分数据的跨域互通,那么我们就需要和他们去约定一大堆的接口,然后自己逐一去实现Proxy,那么这种方式会带来很大的沟通和维护成本。有没有更好的方式呢?有!那就是客户端的JS跨域方案。
二、浏览器端的JS跨域方案
无论是子域还是非子域,JAVASCRIPT本身并没有官方的跨域实现,下面介绍的跨域方案都是开发者创造出来的巧妙的hack实现:
1、设置document.domain跨子域
2、使用iframe的hash
3、使用script标签
4、flash转发
上面各种方案的适用场景和开发成本也是不同的,你可以根据具体的情况来选择合适的跨域方案。