JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。本文主要介绍JSONP跨域原理,一起来看。

JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。JSON系统开发方法是一种典型的面向数据结构的分析和设计方法,以活动为中心,一连串的活动的顺序组合成一个完整的工作进程。

之所以会有跨域这个问题的产生根本原因是浏览器的同源策略限制,理解同源策略的限制同源策略是指阻止代码获得或者更改从另一个域名下获得的文件或者信息。也就是说我们的请求地址必须和当前网站的地指相同。同源策略通过隔离来实现对资源的保护。这个策略的历史非常悠久从Netscape Navigator 2.0时代就开始了。

解决这个限制的一个相对简单的办法就是在服务器端发送请求,服务器充当一个到达第三方资源的代理中继。虽然是用广泛但是这个方法却不够灵活。

另一个办法就是使用框架(frames),将第三方站点的资源包含进来,但是包含进来的资源同样要受到同源策略的限制。

有一个很巧妙的办法就是在页面中使用动态代码元素,代码的源指向服务地址并在自己的代码中加载数据。当这些代码加载执行的时候,同源策略就不会起到限制。但是如果代码试图下载文件的时候执行还是会失败,幸运的是,我们可以使用JSON(JavaScript Object Notation)来改进这个应用。

JSON和JSONP

与XML相比,JSON是一个轻量级的数据交换格式。JSON对于JavaScript开发人员充满魅力的原因在于JSON本身就是Javascript中的对象。

例如一个ticker对象

var ticker = {symbol:'IBM',price:100}

而JSON串就是 {symbol:'IBM',price:100}

这样我们就可以在函数的参数中传递JSON数据。我们很容易掌握在函数中使用动态的JSON参数数据,但是我们的目的并不是这个。

通过使我们的函数能够加载动态的JSON数据,我们就能够处理动态的数据,这项技术叫做 Dynamic Javascript Insertion。

我们看下面的例子:

index.html中

1 <script type="text/javascript">
2  function showPrice(data){  alert("Symbol:" + data.symbol + ", Price:" + data.price);  }
3 var url = "ticker.js"; //Outer JS URL
4 var script = document.createElement('script');
5 script.setAttribute('src', url);  //load javascript  document.getElementsByTagName('head')[0].appendChild(script);  </script>  

ticker.js中

var data = {symbol:'IBM', price:100};
showPrice(data); 

上面的代码通过动态加入Javascript代码,来执行函数加载数据。

正如之前提到过的,同源策略对于动态插入的代码不适用。也就是你可以从不同的域中加载代码,来执行在他们代码中的JSON数据。

这就是JSONP(JSON with Padding)。注意,使用这种方法时,你必须在页面中定义回调函数,就像上例中的showPrice一样。

我们通常所说的JSONP服务(远程JSON服务),实际上就是一种扩展的支持在用户定义函数中包含返回数据的能力。这种方法依赖于必须接受一个回调函数的名字作为参数。

然后执行这个函数,处理JSON数据,并显示在客户页面上。

JQuery的JSONP支持

从JQery 1.2以后,就开始支持JSONP的调用。在另外的一个域名中指定好回调函数名称,你就可以用下面的形式来就加载JSON数据。

url?callback=?

示例:

1 jQuery.getJSON(url + "&callbak=?", function(data)  {  alert("Symbol:" + data.symbol + ", Price:" + data.price);  }); 

jquery会在window对象中加载一个全局的函数,当代码插入时函数执行,执行完毕后就会被移除。同时jquery还对非跨域的请求进行了优化,如果这个请求是在同一个域名下那么他就会像正常的Ajax请求一样工作。

上例中我们在动态插入到页面的代码中使用了静态的json数据,虽然完成了依次JSONP返回,但仍不是JSONP服务,因为不支持在URL中定义回调函数名称。下面是一个将其变成JSONP服务的一个方法

服务器端使用PHP。

首先我们来定义接口的规范,就像这样:http://www.mydomain.com/jsonp/ticker?symbol=IBM&amp;callback=showPrice
symbol是请求条件,callback是回调函数名称。

在页面文件中,我们使用JQuery的支持:

1 //JQuery JSONP Support  var url = "http://www.mydomain.com/api/suggest.php?symbol=IBM&callback=?";
2 jQuery.getJSON(url, function(data){
3 alert("Symbol:" + data.symbol + ",
4  Price:" + data.price);
5 }); 

在suggest.php中

1 $jsondata = "{symbol:'IBM', price:120}";
2  echo $_GET['callback'].'('.$jsondata.')';

再举个.NET webservice 的例子

客户端:

View Code

1 $.getJSON(
2 "http://192.168.0.66/services/WebService1.asmx/ws?callback=?",
3 { name: "ff", time: "2pm" },
4 function(data) { alert(decodeURI(data.msg)) }
5 ); 

服务器端

View Code

1 [WebMethod]  public void ws(string name,string time) {  HttpRequest Request = HttpContext.Current.Request;  string callback = Request["callback"];  HttpResponse Response = HttpContext.Current.Response;  Response.Write(callback + "({msg:'this is"+name+"jsonp'})");  Response.End();  } 

现在,如果我们想制作一些mashup,或者将第三方的资源整合到一个页面中,我们就很容易想到JSONP的解决方法了。

注意:

JSONP是一个非常强大的构建mashp的方法,可是不是一个解决跨域访问问题的万能药。它也有一些缺点:

第一也是最重要的:JSONP不提供错误处理。如果动态插入的代码正常运行,你可以得到返回,但是如果失败了,那么什么都不会发生。你无法获得一个404的错误,也不能取消这个请求。

另外一个重要的缺点是如果使用了不信任的服务会造成很大的安全隐患。

转自:http://developer.51cto.com/art/201105/264791.htm

转载于:https://www.cnblogs.com/yja9010/archive/2012/12/06/2806301.html

JSONP跨域原理和jQuery.getJSON用法相关推荐

  1. JSONP跨域jQuery处理整理(附天气数据实例)

    写在前面 跨域的解决方案有多种,其中最常见的是使用同一服务器下的代理来获取远端数据,再通过ajax进行读取,而在这期间经过了两次请求过程,使得获取数据的效率大大降低,这篇文章蓝飞就为大家介绍一下解决跨 ...

  2. 【转载】一个通过JSONP跨域调用WCF REST服务的例子(以jQuery为例)

    一个通过JSONP跨域调用WCF REST服务的例子(以jQuery为例) JSONP(JSON with Padding)可以看成是JSON的一种"使用模式",用以解决" ...

  3. JSONP跨域获取JSON数据(含jQuery方法)——李帅醒博客

    首先我要强调JSONP和AJAX没有半毛钱关系,别把他们混淆!!!只不过他们都是从后台获取数据的方法! 前言: 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨 ...

  4. jsonp 跨域原理详解

    转载至:http://zha-zi.iteye.com/blog/1975116 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制 ...

  5. jsonp跨域访问服务

    前段时间在做产品开发的时候,需要与公司网站那边进行交互,我们所开发的产品上线后是放在一个域名下,公司网站那块是在另一个域名下,这样在页面中调用 网站那边的接口时就存在跨域的问题,当时为了不修改网站那边 ...

  6. JSONP跨域的原理解析

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略). ...

  7. JSONP跨域的原理解析及其实现介绍

    JSONP 即 Json padding ,JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并且探讨下JSONP跨域的原理 JavaScript是一种在Web ...

  8. Jsonp 跨域请求实例

    Jsonp 跨域请求实例 关于jsonp的一个实例,其实自己也不是很了解,今天下午稍微研究了一下: 简单来说,jsonp就是为了两个不同网站之间数据传递而产生的,主要用于js脚本,因为浏览器本身是禁止 ...

  9. 轻松搞定JSONP跨域请求

    轻松搞定JSONP跨域请求 一.同源策略 要理解跨域,先要了解一下"同源策略".所谓同源是指,域名,协议,端口相同.所谓"同源策略",简单的说就是基于安全考虑, ...

最新文章

  1. 使用 MDT2008 轻量部署进行 Windows XP SP2 简单部署
  2. Spark on Yarn集群多Application并行执行
  3. boost::range模块实现报告称范围适配器相关的测试程序
  4. 深度学习总结:tensorflow和pytorch关于RNN的对比,tf.nn.dynamic_rnn,nn.LSTM
  5. docker容器状态跟踪及疑惑
  6. CSS3 box-shadow 属性
  7. 等重构完这系统,我就辞职!
  8. C++的学习(十)类和对象
  9. 如何使用DDMS读取data/data目录下的文件
  10. Vue2.0 的漫长学习ing-2-1
  11. WebStorm WiFi真机同步无法安装成功及appLoader无法连接
  12. 云计算是什么,主要具有哪些特点
  13. python爬取网页数据总结_pycharm爬取网页数据
  14. 从0开发豆果美食小程序——搜索组件
  15. ValueError: Solver lbfgs supports only ‘l2‘ or ‘none‘ penalties, got l1 penalty.
  16. html 图片转换成word,在Word中通过把编辑的图片另存为HTML文件实现转换图片
  17. 终结拖延症——行动的理由
  18. 如何找出1-100之间的质数
  19. Linux定时任务详解
  20. 非线性系统【二】Lyapunov稳定性

热门文章

  1. Linux小知识(零散)
  2. CF989E A Trance of Nightfall(概率+矩阵快速幂优化+倍增)
  3. Appium——api常用函数
  4. Anaconda日志
  5. iframe在ipad safari的显示
  6. 实现、设置-Android TabWidget-by小雨
  7. Linux 安装 OpenOffice
  8. javascript 获取上一页的url
  9. oracle索引使用例子,Oracle中利用函数索引处理数据倾斜案例
  10. linux 刻录cd,Linux 刻录CD/DVD命令 growisofs/mkisofs/cdrecord