说说jsonp

什么是jsonp

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

 

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

 

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

 

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

 

好比:java

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放在一块儿,彻底是因为他们的调用和使用方式很相像而已。jquery

 

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

jsonp有什么优势呢?

第一个优势固然是能跨域了。一个访问再也不受限于域名了,这个表明什么呢?表明我能够提供一个公共的webservice了,这个服务能够给你服务,也能够给他服务,大家不须要必定是在个人域名下的。ajax

 

其次的优势是将回调方法的权限给了调用方。这个就至关于将controller层和view层终于分开了。我提供的jsonp服务只提供纯服务的数据,至于提供服务之后的页面渲染和后续view操做都由调用者来本身定义就行了。若是有两个页面须要渲染同一份数据,大家只须要有不一样的渲染逻辑就能够了,逻辑均可以使用同一个jsonp服务。json

 

还有一个优势是它甚至不须要浏览器能支持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

相关文章
相关标签/搜索