参考资源:
前端跨域通信的几种方式
前端跨域通信原理及示例
同源策略及限制
同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。
所谓同源是指:域名,协议,端口 相同。
cookie,localstorage,dom
没办法相互获取 ,ajax
请求也不能
前后端的通信方式
Ajax
- 通过在后台与服务器进行少量数据交换,Ajax
可以使网页实现异步更新 - 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术 - 同源下使用的通信方式WebSocket
- 不限制同源策略 - 基于TCP
的一种新的网络协议 - 实现了浏览器与服务器全双工(full-duplex
)通信——允许服务器主动发送信息给客户端。CORS
- 支持跨域通信也支持同源通信 -CORS
机制让web
服务器能跨站访问控制 - 简单请求 - 浏览器直接发送CORS
跨域请求,并在header
信息中增加一个Origin
字段,表明这是一个跨域的请求。 - 非简单请求 - 在正式通信前进行一次Http
查询请求,又称预检请求
跨域通信
JSONP
HASH
postMessage
WebSocket
CORS
JSONP
跨域原理
利用 <script src=””></script>
中的 src
的地址可以跨域,动态的构造 script
标签,以实现跨域数据访问。
前端通过 script
标签以发送请求,
1 | <scirpt src="http://www.abc.com/?data=name&callback=callback_fn" charset="utf-8"></scirpt> |
服务端返回的也是 script
标签,callback
就是方法名
1 | function callback_fn(data) { |
完整的 jsonp
封装
1 | /** |
Hash
url
的 #
后面的内容就叫 Hash
。Hash
的改变,页面不会刷新。这就是用 Hash
做跨域通信的基本原理。
补充:url
的 ?
后面的内容叫 Search
。Search
的改变,会导致页面刷新,因此不能做跨域通信。
使用举例:
场景:我的页面 A
通过 iframe
或 frame
嵌入了跨域的页面 B
。
现在,我这个 A
页面想给 B
页面发消息,怎么操作呢?
(1)首先,在我的 A
页面中:
1 | //伪代码 |
(2)然后,在 B
页面中:
1 | // B中的伪代码 |
postMessage()方法
H5
中新增的 postMessage()
方法,可以用来做跨域通信。既然是 H5
中新增的,那就一定要提到。
场景:窗口 A (http:A.com)
向跨域的窗口 B (http:B.com)
发送信息。步骤如下。
(1)在 A
窗口中操作如下:向 B 窗口发送数据:
1 | // 窗口A(http:A.com)向跨域的窗口B(http:B.com)发送信息 |
WebSocket
WebSocket 的用法如下:
1 | var ws = new WebSocket("wss://echo.websocket.org") //创建WebSocket的对象。参数可以是 ws 或 wss,后者表示加密。 |
(2)在 B
窗口中操作如下:
1 | // 在窗口B中监听 message 事件 |
CORS
CORS
可以理解成是既可以同步、也可以异步*的 Ajax
。
fetch
是一个比较新的 API
,用来实现 CORS
通信。用法如下:
1 | // url(必选),options(可选) |
CORS
为什么能实现跨域通信?浏览器会拦截Ajax
,如果Ajax
是跨域的,会在Http头部增加
origin
CORS
和 JSONP
比较
CORS
和 JSONP
都是为了使 web
浏览器能够跨源请求,使用目的相同,但是比 JSONP
更强大。JSONP
只支持GET
请求,而 CORS
支持所有类型的 HTTP
请求,不过JSONP
的优势在于支持老式浏览器以及可以向不支持 CORS
的网站跨源请求。