加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

JSONP -- one way of cross-domain data sharing

发布时间:2020-12-16 18:58:06 所属栏目:百科 来源:网络整理
导读:要说清楚JSONP首先得说Same-origin policy,同源策略。为了安全起见,两个不同得网站之间是不能访问对方的数据的,比如A站的cookies不能被B站访问。但是如果这两个网站是相同domain的,比如是同一个公司的网站,那彼此访问是没有问题的,因为是可信任的。就

要说清楚JSONP首先得说Same-origin policy,同源策略。为了安全起见,两个不同得网站之间是不能访问对方的数据的,比如A站的cookies不能被B站访问。但是如果这两个网站是相同domain的,比如是同一个公司的网站,那彼此访问是没有问题的,因为是可信任的。就像同domain的OOS(单点登录)的实现可以用cookie来实现一样。

这样的domain,或者说Same-origin里面的origin指的是URI scheme,hostname<script type="application/javascript" src="http://server.example.com/Users/1234"> </script>

{
    "Name": "Foo","Id": 1234,"Rank": 7
}

通过这个script成功的从另外一个domain获得了那个domain里面一个用户的信息,但是这样显然是不够的,把一个JSON片段放进一个html页面中,没有任何javascript变量来接收它是不行的,浏览器会报错。
<script type="application/javascript"
        src="http://server.example.com/Users/1234?callback=parseResponse">
</script>

客户端必须提供一个回调方法来接收这些数据,于是JSON+padding就被叫做JSONP了。它实现了一种跨域共享数据的方式。

比如baidu地图API有个方法可以返回某个地方的坐标是多少:

bdary.get("四川省成都市天府新区")

显然这个计算坐标的过程发生再百度的服务器而不可能是你自己的服务器,因为你没有相关的方法计算。那百度返回的就是一个JSON的数据,所以你需要提供一个回调方法:
bdary.get("<span style="font-family: Arial,Helvetica,sans-serif;">四川省成都市天府新区</span><span style="font-family: Arial,sans-serif;">",function(rs){       </span>
//回调方法,根据返回的数据实现你自己的业务逻辑
				});   
一个跨域OOS的设想,比如我有个网站:www.example.com,我想要实现和csdn账号的单点登录,也就是说只要用户在当前浏览器登录了csdn就不用再登录,直接可以使用我的网站,并且用的就是csdn的账号信息。当然这得csdn愿意,它如果愿意得话它会提供一个JSONP的调用给我,我调用它的方法之后就可以得到当前的登录状态以及已经登录的用户的信息。

JSONP是有安全隐患的,这很正常,它并不是一个行业标准,只是人们为了解决跨域访问的问题而自己想出的办法。曾经有人提议定义标准来弥补这一缺陷,但是提议被放弃了,因为当时有了跨域访问的另外一个标准CORS。

所以JSONP并不是跨域访问的唯一方法,也不是一个完美的方式,但是它的确是简单好用的方式,并且安全隐患是可以编码解决的。

其他一些解决跨域数据访问的方式参见维基百科:

https://en.wikipedia.org/wiki/Same-origin_policy

本文的一些概念性论述也参考了维基百科。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读