说说jsonp

标签: jsonp | 发表时间:2014-10-20 14:30 | 作者:hongtoushizi
出处:http://www.iteye.com

什么是jsonp

jsonp充其量只能说是一种“方法”。它可以让页面从其他域中获取资料。

 

首先要知道的是同源策略,在javascript中使用http请求(ajax)是会受到同源策略的限制的。A网站的页面是不能在javascript中访问B网站的资源的。但是,对于这种希望A网站访问B网站的资源的需求怎么办呢?(跨域访问)。jsonp就出现了。

 

html 中虽然说javascript是不能跨域的,但是有许多标签,比如<img>,<iframe>,<script> 这些有src属性的标签是不受同源策略的影响的。于是jsonp就把脑筋动到script标签上了。一般script都是静态的,但是script能否是 动态的呢?

 

比如我在script的src中的url带上用户id,这样来访问一个跨域的请求,请求返回这个用户的 个人信息,我再使用这个个人信息来渲染我的页面。这样不就可以完成了一个跨域请求了。但是呢?script中返回的必须是javascript,所以呢, 一般就约定,src中的url除了要带动态请求所需要的信息以外,还需要带一个回调信息(一般是一个回调函数),让请求返回的数据是一个可执行的 javascript的完整语句。

 

比如:

1
2
3
4
5
6
7
8
9
function handle_data(data) {
    // `data` is now the object representation of the JSON data
}
 
 
---
http: //some.tld/web/service?callback=handle_data:
---
handle_data({ "data_1" : "hello world" , "data_2" : [ "the" , "sun" , "is" , "shining" ]});

再问个经常问到的问题,jsonp和ajax,json有什么关系呢?

首先jsonp和ajax完全是两个概念,可以说jsonp出现的理由就是弥补ajax无法跨域访问的缺陷而出现的。所以这两个概念没啥关系。至于有些框架,比如jquery喜欢把ajax和jsonp放在一起,完全是由于他们的调用和使用方式很相像而已。

 

jsonp返回的数据并不是json,而是javascrip,比如上例中的handle_date中返回的数据一定要是json么?从来没人这么说过。再次吐槽下,特别是前端的这些概念的名词确实起的很容易让人迷糊。

jsonp有什么优点呢?

第一个优点当然是能跨域了。一个访问不再受限于域名了,这个代表什么呢?代表我可以提供一个公共的webservice了,这个服务可以给你服务,也可以给他服务,你们不需要一定是在我的域名下的。

 

其次的优点是将回调方法的权限给了调用方。这个就相当于将controller层和view层终于分开了。我提供的jsonp服务只提供纯服务的数 据,至于提供服务以后的页面渲染和后续view操作都由调用者来自己定义就好了。如果有两个页面需要渲染同一份数据,你们只需要有不同的渲染逻辑就可以 了,逻辑都可以使用同一个jsonp服务。

 

还有一个优点是它甚至不需要浏览器能支持XMLHTTPRequest,就是说所有的浏览器都可以使用这个技术。

json有什么缺点呢?

首先的缺点是安全性。万一假如提供jsonp的服务存在页面注入漏洞,即它返回的javascript的内容被人控制的。那么结果是什么?所有调用 这个jsonp的网站都会存在漏洞。于是无法把危险控制在一个域名下…所以在使用jsonp的时候必须要保证使用的jsonp服务必须是安全可信的。

 

其次是错误处理,jsonp在调用失败的时候不会返回各种HTTP状态码。只有200,没有404,没有500等状态码让你来标识是否要重新调用。

 

它只能支持GET,而不能支持POST请求,所以它的参数一定是带在HTTP头中的,会受到一些参数的限制,比如长度限制。

参考文章

http://blog.csdn.net/liaomin416100569/article/details/5480825

http://jingyan.baidu.com/article/eb9f7b6dbd3ff0869364e81c.html

http://www.json-p.org/

http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

 

转载自: http://www.cnblogs.com/yjf512/p/3222269.html



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [jsonp] 推荐:

jsonp详解

- - 博客园_首页
json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西. 下面一步步来搞清楚jsonp是个什么玩意. 首先基于安全的原因,浏览器是存在 同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 看起来不知道什么意思,实践一下就知道了.

jQuery JSONP跨域

- - Web前端 - ITeye博客
基于Jquery的Ajax跨域访问. 单点登录服务器(sso服务器). 登录网页项目的时候,由于使用了单点登录,所以页面会跳转到sso服务器,进行统一登录,. 现在需要在该界面增加令牌的认证,但是SSO服务器和令牌服务器部署在不同的服务器,且暂时没有要合并的可能,所以在SSO登录的时候必须要对令牌进行验证,就必须涉及到了跨域访问的问题.

跨域 jsonp

- - 互联网 - ITeye博客
跨域有好多种方式,会根据当前的业务逻辑选择对应方式. 这里介绍了jsonp的方法的实现过程. 模拟两个不同的域(下面用a.com 和b.com 来讲解). a.com站点下面创建一个client.html . b.com站点下面创建一个server.php. a.com站点通过js跨域请求b.com站点,我们利用script标签不受域访问限制特点进行请求(img标签同样有此特点),最主要的特点就是能执行请求返回来的js脚本.

说说jsonp

- - Web前端 - ITeye博客
jsonp充其量只能说是一种“方法”. 它可以让页面从其他域中获取资料. 首先要知道的是同源策略,在javascript中使用http请求(ajax)是会受到同源策略的限制的. A网站的页面是不能在javascript中访问B网站的资源的. 但是,对于这种希望A网站访问B网站的资源的需求怎么办呢. html 中虽然说javascript是不能跨域的,但是有许多标签,比如,