跨域问题常见解决方案

我个人将跨域问题分类为两种:网络请求跨域非网络请求跨域

网络请求跨域

网络请求跨域的解决方案有:

  • 图像img
  • JSONP
  • CORS
  • Nginx反向代理、Nodejs中间件
  • SSE、Web Socket(它们是服务器推送技术,无跨域问题)

详细信息在这里

非网络请求跨域

document.domain

如果要进行通信的窗口之间主域相同,子域不同,则可以直接将它们的 document.domain 修改为主域,这样就不存在跨域问题了。

1
2
<iframe name="a" src="http://a.domain.com"></iframe>
<iframe name="b" src="http://b.domain.com"></iframe>
1
2
3
4
5
<!-- domain 初始值为 a.domain.com -->
<script>
document.domain = 'domain.com';
var user = 'a';
</script>
1
2
3
4
5
<!-- domain 初始值为 b.domain.com -->
<script>
document.domain = 'domain.com';
alert('get js data from a ---> ' + window.parent.frames.a.user);
</script>

location.hash

父窗口 A 修改子窗口 B 的 location.hash 值,会触发对应子窗口 B window 对象的 onhashchange 事件处理程序。这个过程是单向的,但是你可以通过在子窗口 B 中添加一个 iframe 标签,这个 iframesrc 域名与父窗口域名相同的,然后在这个 iframe 页面内调用父窗口 A 的函数,此时是不存在跨域的。

window.name

window 对象的 name 属性有一个独特之处,一个窗口只要一直存在并且没有被主动的更改 name 属性,那么它的 name 属性会一直保持不变。即窗口的 URL(或 iframesrc)随意变化,name 属性也不会变。name 属性内存最大可以支持 2MB,所以可以通过它来传递数据。

window.postMessage

通过 window.postMessage 方法和 message 事件完成数据的传递。

参考



感谢您的阅读,如果发现文章中有错误或漏洞,请批评指正。
邮箱:aadonkeyz@gmail.com

0%