浏览器的同源策略以及跨域解决办法

参考学习:https://blog.csdn.net/letterTiger/article/details/79520375
http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html
同源策略的限制:

1.存储在浏览器中的数据,如localStroage、Cooke和IndexedDB不能通过脚本跨域访问 
2.不能通过脚本操作不同域下的DOM
3.不能通过ajax请求不同域的数据

规避同源策略
1.cookie同源策略的规避:

document.domain

2.DoM同源规避:

document.domain
Hash(片段识别符)
window.name
window.postMessage

3.Ajax同源策略规避:

jsonp
CORS
webSocket

document.domain document.domain只可以在拥有相同的主域名的不同子域名之间跨域。
hash因为hash的改变并不会引起页面的刷新同时可以通过 window.onhashchange事件监听到hash的改变,所以可以通过hash来跨域传递数据。
注意:该方法会直接暴露所传递的数据并且对所传数据有大小限制。
window.name window.name有一个特性,即使当前窗口的地址改变了window.name的值也不会改变。可以利用这一特性来进行跨域,步骤如下:

1 .通过iframe加载需要获取数据的地址
2. 在加载的文件上将数据设置到window.name上
3. 数据获取完成后将iframe的地址设置为当前文档同域
4.通过DOM操作拿到window.name上的数据

window.postMessage(h5中新增跨文档通信API)
messageEvent对象上的属性中有三个属性要注意,分别是:
1.source 发送消息的窗体
2. origin 发送消息的域名 (根据域名判断是否处理该消息)
3.data 发送消息的内容 (获取发送的消息内容)

jsonp jsonp只支持GET请求。

CORS是跨源资源分享(Cross-Origin Resource Sharing)的缩写。它是W3C标准,是跨源AJAX请求的根本解决方法。相比JSONP只能发GET请求,CORS允许任何类型的请求。
后台程序的响应头加上如下字段:

  Access-Control-Allow-Origin: http://example.com

WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。

猜你喜欢

转载自blog.csdn.net/weixin_41989325/article/details/89388204