跨域问题的总结

这里不再赘述同源政策。
1.cookie的跨域
只有同源的网站才能共享Cookie,但是如果两个网站一级域名相同,只是二级域名不同,那么就有两种解决的方法:
A:在两个页面上设置相同的document.domain,那么cookie可以共享。
B:或者在服务端,在cookie上设置相同的domain


2.iframe的跨域
父窗口获取不到子窗口的dom,子窗口也获取不到父窗口的dom;如果一级域名相同,二级域名不同,那么和cookie一样设置相同的document.domain,就可以了,如果完全不相同,有三种解决跨域窗口的通信问题
A:片段识别符
片段标识符是指的是:在URL的#号后面的部分,比如http://example.com/x.html#fragment的#fragment部分,如果只是改变#号后面的页面不会刷新。父窗口可以把信息,写入子窗口的片段标识符中。在子窗口中通过window.onhashchange得到这个消息,同样子窗口也可以改变父窗口的片段标识符
B:window.name
浏览器窗口有个window.name属性,这个属性的最大特点是,无论是否同源,只要是在同一个窗口里,前一个网页设置了这个属性,后一个网页就可以读取它。
C:跨文档通信API(cross-document messaging)
上面两种方法都是破解,HTML5为了解决这个问题,引入了一个全新的API:跨文档通信API,这个API为window对象新增了一个window.postMessage()方法,允许跨窗口通信,不论这两个窗口是否同源,


3.AJAX的跨域
同源政策规定AJAX只能发送给同源的网址,否则就报错。
除了架设代理服务器(AJAX想代理服务器发出同源清求,然后在由代理服务器请求外部服务器),有三种方法规避这个限制。
A:JSONP
JSONP是跨域清求常用的方法,最大的特点就是简单适用,老式浏览器全部都支持,服务器改造也非常小。JSONP的基本思想是向网页添加一个script标签,由这个标签来向服务器清求JSON数据,这种做法不受同源政策的限制,服务器收到清求后,将数据放在一个指定名字的回调函数里,传回来。
B:Websocket
Websocket是HTML5新加入的一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀,该协议不实行同源政策,只要服务器支持,就可以通过它进行跨域。
C:CORS:请看我的另一篇文章。

阅读更多
换一批

没有更多推荐了,返回首页