什么是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.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html
转载自: http://www.cnblogs.com/yjf512/p/3222269.html
相关推荐
JSONP简单调用实例。ASP.NET和纯HTML。jQuery的$.ajax的调用!jsonP说白了,就是在json字符串外面包上一个:参数名称+左右括弧!只是包了个:jsonpCallback() 而已! 相关文章:...
解决跨域封装的jsonp
jsonp的原理 jsonp的使用,使用jsonp解决js跨域问题!
Jsonp和java操作
后台php设置jsonp
JSONP 实例
在页面a中由前端发送一个jsonp请求到客户方,得到一个token值 前端得到token值后向自己后端发送一个请求,后端根据token去redis(token的值就是redis里的key)里取值(key=token的值,value=用户信息等)判断用户是否已...
总算理解jsonp的应用了,以前只知道jsonp但是还是不会再代码中应用,看了这个以后突然恍然大悟,妈妈再也不用担心我学不会jsonp了(/坏笑,以上纯属虚构)
前端使用jquery,datatype采用jsonp,服务端采用C#编写的webService
纯servlet实现JSONP 非常简单易懂的一个例子。
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的...
ajax jsonp跨域传参,里面有源码,不过写在txt中了,很适合调用别人的接口
jsonp XML解析
交接jsonp,轻松实现跨域方法的调用,很值得学习的东西
Jquery easyui+Jsonp+asp.net+翻页 事件版
基于ajax方式的跨域请求jsonp的前后台代码
自己封装jsonp.js
对应我的文章json和jsonp格式数据返回
使用Jquery中的Aajx方法利用Jsonp方式访问豆瓣公开的api接口,跨域获取书籍信息。
使用jsonp跨域获取json数据。Ajax获取JAVA服务器json数据。