JSONP作为js跨域请求的一个方案,很早就知道了,一直没有详细了解。今天了解了一下,记录下来。
JSONP 是 JSON with Padding 是缩写。是指定数据格式json的一种使用模式,可以让网页从别的域名要数据。
我们都知道浏览器安全最基本的就是“同源策略”
同源策略是指URL的三个要素:
- 协议相同
- 域名相同
- 端口相同
它会限制三种行为:
- Cookie、LocalStorage
- DOM 无法获得
- AJAX 请求不能发送
同源策略的目的是为了保证用户信息的安全。因此是必要的。
但是有时候对开发来讲也会不方便,尤其是 ajax 请求。
因些就是有 jsonp 的方案。
从上面的限制列表中可以看到,浏览器的同源策略限制了 Cookie, DOM, Ajax, 但是是没有HTML的一些标签,比如:
1 | <img src=""> |
比如 A 站点的地址是 http://example1.com/page/test.html, 页面上的 script 是
1 | <script src="http://example2.com/test.js"></script> |
是可以请求到数据,浏览器并不做限制。这样就可以执行 example2.com 上的js文件了。
但是我们有时候需要一种理自由的处理example2.com 上的数据,就需要在 example2.com 上写一些接口,比如:
http://example2.com/test.php
比如这个接口返回json: {“result”: “This is test”}.
但是 script 标签对于返回的 json 并没有什么用。而且script 的返回是由js解析器直接执行了。
因此,我们可以直接 js 函数,或者 js 函数的调用,比如:
1 | process({"result": "This is test"}); |
这样我们就实现了在 example1.com 站点上调用 example2.com 上数据的目的。