在前端开发中,熟练使用ajax从后台接口获取数据是必备的技能。但是为了安全,XmlHttpRequest对象在默认情况下只能访问同源(协议、域名、端口号完全相同)的数据,就是常说的跨域安全策略。在前后端分离的今天,合理跨域至关重要,所以在前端也有很多方法可以实现跨域,比较常用的是JSONP和CORS,当然还有nodejs配合webpack可以实现http代理来达到跨域效果,这个也比较常用。
我们先来用nodejs来起一个简单的服务,当请求为http://localhost:3000/user
返回一个json数据
|
|
客户端
|
|
执行后,就会出现报错,就是同源限制造成的
JSONP实现原理
JSONP是JSON with padding(填充式JSON或参数式JSON)的简写,是应用JSON的一种方式。
JSONP的实现原理很简单,利用<script>
标签没有同源限制的特点,也就是<script>
的src链接可以访问不同源的。不受同源限制的还有<img>
、<iframe>
、<link>
,对应这两个标签实现的跨域方法也有,比如图片ping等。
我们访问服务端,一般是获取存JSON数据,而JSONP则返回的是,包含函数的数据,将我们需要的JSON数据作为函数的参数
|
|
我们在客户端则一般通过<script>
标签的src访问带有callback查询参数的请求,来获取返回带有函数的数据,然后执行它
|
|
我们先定义了回调函数jsonpCb
,然后通过另外一个<script>
标签获取数据,返回
|
|
返回后就会执行这个这个函数,就可以得到我们想要的json数据了
我们来模拟一下
客户端
|
|
客户端就是我们前面所定义的
|
|
我们开启本地服务直接在浏览器输入http://localhost:3000/user?callback=jsonpCb
,可以看到
|
|
执行客户端html文件,可以看到输出结果,随后就可以操作他们了
|
|
封装
为了方便使用,封装一个jsonp工具
|
|
调用
|
|
补充:JSONP可以兼容老版的浏览器,但是只能发送get请求。