JSONP跨域原理和jQuery.getJSON用法

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

window10安装python2.7_window10下python2.7安装pip报错

get-pip.py 文件内容来源于(将网页内容保存) https://bootstrap.pypa.io/get-pip.py 报错信息 D:\softs\python\Python27>python get-pip.py DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 wont…

DAHDI与Zaptel

1、DAHDI是什么&#xff1f; DAHDI表示DigiumAsterisk Hardware Device Interface&#xff0c;Zaptel是"ZapataTelephony"的缩写。 2、DAHDI的由来 Kevin Fleming是这样介绍DAHDI的来由的&#xff1a;“大约2006年&#xff0c;ZapTel商标的持有人找上我们&#x…

php判断桌面宽度,js获取页面宽度高度及屏幕分辨率

网页可见区域宽&#xff1a; document.body.clientWidth;网页可见区域高&#xff1a; document.body.clientHeight;网页可见区域宽&#xff1a; document.body.offsetWidth (包括边线的宽);网页可见区域高&#xff1a; document.body.offsetHeight (包括边线的宽);网页正文全…

串口输出5v电压_为什么RS485比串口速度快距离远?--谈单端信号与差分信号之差异...

嵌入式系统中&#xff0c;串口、RS485、CAN、网络和USB等都是非常常用的通信方式。但是串口通信速度慢&#xff0c;距离近&#xff0c;为什么转换成RS485后&#xff0c;通信距离和速度都大幅提高了呢&#xff1f;USB也是近距离&#xff0c;为什么速度可以这么快&#xff1f;原因…

IIS7.0站点/虚拟目录中访问共享

目的&#xff1a;实现一个2008serve的IIS的虚拟目录&#xff08;通过网络路径&#xff08;UNC&#xff09;的形式&#xff0c;共享在另外一个2008服务器上&#xff09; 准备工作1.运行组策略编辑器&#xff08;gpedit.msc&#xff09;&#xff1b;找到本地安全策略-本地策略-安…

易语言操作php文本文件,易语言对文本操作的步骤教学

在易语言编程中&#xff0c;我们往往需要对一些文字进行截取或分割出来&#xff0c;如何准确、快速的实现这一目标呢&#xff1f;下面笔者来为大家演示1、首先&#xff0c;我们打开易语言编程软件&#xff0c;点击左上角&#xff0c;新建一个文件&#xff0c;如图所示2、我们点…

Asterisk入门系列

什么是asterisk?开源电话平台 Asterisk 通过了电话的开源平台。基本上就是一个软件的PBX。 最初是Digium 公司的Mark Spencer编写的&#xff0c;这个公司就是他创立的&#xff0c;专门生产并销售Asterisk使用的硬件。Asterisk简直就是一场电话的革命。 为什么使用Asterisk&…

xxl-job 执行结果是空_xxljob dotnet core executor执行器开源

DotXxlJob[(github)https://github.com/xuanye/DotXxlJob][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现&#xff0c;支持XXL-JOB 2.01 XXL-JOB概述[XXL-JOB][1]是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量…

两千内给力的大屏手机(二)

一看标题就知道哈&#xff0c;这是接着上次来说的呢&#xff0c;上次介绍了四款手机&#xff0c;这次介绍剩下的四款&#xff0c;大家看好了啊 1、HTC T329t双核 你还没有忘记新渴望 VT这款产品吧&#xff0c;作为HTC和移动推出的性价比大众智能产品&#xff0c;新渴望 VT在上市…

php5.4 windows2003,PHP实战:Windows2003下php5.4安装配置教程(IIS)

《PHP实战&#xff1a;Windows2003下php5.4安装配置教程(IIS)》要点&#xff1a;本文介绍了PHP实战&#xff1a;Windows2003下php5.4安装配置教程(IIS)&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。PHP教程一、在Windows2003安装IISPHP教程1、首先打开Windo…

foxmail 怎么把邮件格式默认为html_Python SMTP发送邮件-smtplib模块

在进入正题之前&#xff0c;我们需要对一些基本内容有所了解&#xff1a;常用的电子邮件协议有SMTP、POP3、IMAP4&#xff0c;它们都隶属于TCP/IP协议簇&#xff0c;默认状态下&#xff0c;分别通过TCP端口25、110和143建立连接。Python内置对SMTP的支持&#xff0c;该协议支持…

Arm-Linux 编译Asterisk

需要重新编译的包ncurses-5.6.tar.gzopenssl-0.9.8g.tar.gztermcap-1.3.1.tar.gz Asterisk-1.2.16没有编译通过的模块chan_alsa.so //需要alsa的支持format_ogg_vorbis.sosmsqastman

Nhibernate 过长的字符串报错 dehydration property

用nhibernate发现一个错误&#xff0c;一个文本输入框输入字符过长&#xff0c;会被在固定的地方截断&#xff0c;经过试验发现4000个字符8000个字节的时候会被截断。看了一下映射文件中的xml配置&#xff0c;发现映射字段如下&#xff1a;<property column"Content&qu…

串口与modem流量控制大全(1)

MODEM是用户接入互联网的重要设备。虽然网络干线上已经普及宽带光纤传输&#xff0c;但是在拥有庞大用户群的最后一公里路段上&#xff0c;目前最现实的接入方式还是铜线连接(电话线&#xff0c;双绞线、电缆)。另外&#xff0c;随着无线技术的发展&#xff0c;采用无线接入的固…

Qt creator工程项目移植时因环境变换造成qmake错误的解决方案

1.问题描述&#xff1a;移植从他机上的qt工程项目&#xff0c;打开时提示&#xff1a; Qt Creator找到了一个由其他开发环境创建的设置文件&#xff0c;或许是来自于其他机器的。用户设置文件包含了特定的环境设定&#xff0c;它不应当被复制到其他应用环境中去。 你仍然想载入…

leftjoin多表联合查询_leetcode-sql练习精讲系列文章——一、多表如何连接

这是一个系列文章&#xff0c;涵盖了SQL最常用的知识点。题目来自于leetcode的sql题&#xff0c;文章列出了问题-完整解析-答案-知识点拓展-BAT等大厂面试真题。希望能帮你全方位的弄懂。有问题可以留言&#xff0c;码字不易&#xff0c;写一篇要好几个小时&#xff0c;希望能得…

噪声调频 matlab,如何用matlab编写噪声调频干扰信号

2013-11-01qsort函数怎么编&#xff1f;qsort,包含在stdlib。h头文件里,函数一共四个参数,没返回值。一个典型的qsort的写法如下qsort(s,n,sizeof(s[0]),cmp);其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式);第二个参数是…

简明Python3教程 16.标准库

简介 python标准库作为python标准安装的一部分&#xff0c;其自身包含数量庞大的实用模块&#xff0c; 因此熟悉python标准库非常重要&#xff0c;因为很多问题都能利用python标准库快速解决。 下面我们将研究标准库中的一些常用模块。完整的标准库模块列表可以在安装python时附…

串口与modem流量控制大全(2)

PC端处理: 本端发送 当 发现&#xff08;不一定及时发现&#xff09; CTS (-3V to -15V)无效时&#xff0c;停止发送, 当 发现&#xff08;不一定及时发现&#xff09; CTS (3V to 15V)有效时&#xff0c;恢复发送&#xff1b; 本端接收 0&l…