`
阅读更多

    在介绍JSONP之前,先简单的介绍一些JSON。JSON是JavaScript Object Notation的缩写,是一种轻量的、可读的基于文本的数据交换开放标准。源于JavsScript编程语言中对简单数据结构和关联数组的展示功能。它是仅含有数据对和简单括号结构的纯文本,因此可通过许多途径进行JSON消息的传递。

 

1. JSONP定义
    JSONP是英文JSON with Padding的缩写,是一个非官方的协议。它允许在服务器端生成script tags返回至客户端,通过javascript callback的形式来实现站点访问。 JSONP是一种script tag的注入,将server返回的response添加到页面实现特定功能。

2.JSONP由来

    要解释JSONP的来由,先要说一下浏览器的“同源策略(SOP:Same Origin Policy)”。 简而言之,就是浏览器限制脚本程序只能和同协议、同域名、同端口的脚本进行交互,这包括共享和传递变量等。cookie的传递也是遵从同样策略。这就造成一些涉及到多个服务器的应用在整合时一些麻烦。跨域访问的问题造成A站点的Ajax代码无法访问B站点的数据。

     如何解决跨域访问呢?那就要借助浏览器的一个特性:尽管浏览器不允许页面中的脚本程序跨域读取数据,但却允许HTML引用跨域的资源,如图片,CSS和脚本程序。对于脚本程序的引用比较特殊,它被浏览器解析以后,就和本地的脚本程序别无二致且可立即进行解释并执行。如在B站点的一个js文件,一个简单的提示框:alert(“This is Victor!”);。在A站点引用这个js,这个脚本就会在B站点的应用中执行,显示一个alert信息。由于站外脚本的引用是通过script tag来实现的,而脚本程序又可通过DOM的方式可以对HTML页面的所有标签进行控制(包括动态的创建script标签),这就可以实现通过调用站外程序对本地资源进行更改了。另外,通过<script> 标记的使用,就可从服务端直接返回可执行的JavaScript函数调用或者JSON数据。

 

3. JSONP原理与实现
    首先在客户端注册一个callback, 然后把callback的名字传给服务器。此时,服务器先生成 JSON数据。然后以JavaScript 语法的方式,生成一个function, function名字就是传递上来的参数jsonp.  

    然后,将JSON数据直接以入参的方式,放置到function中,这样就生成了一段 js 语法的文档,返回给客户端。 

    最后,在客户端浏览器中解析script标签,并执行返回的JavaScript文档,此时数据作为参数,传入到了客户端预先定义好的回调函数里(动态执行回调函数) 。

 

 

其实 JSONP是个很简单的一个东西。主要是利用了 <script/>标签对javascript文档的动态解析来实现。(其实也可以用eval函数) 

 

JSONP实现代码:

< script  type=" text/javascript" >       
        function  jsonpCallback(result){
             alert(result.msg);
        }       
< /script>       
< script  type=" text/javascript"   src=" http://mydomain.com/jsonService?jsonp=jsonpCallback">
< /script> 

注解:

jsonCallback是获取跨域服务器上的JSON数据后的客户端的回调函数。 

http://mydomain.com/jsonService?jsonp=jsonpCallback是获取跨域服务器JSON数据的接口,参数为回调函数的名字。返回的格式为:

jsonpCallback({ msg:'this  is  json  data'} )

 

4. jQuery与JSONP

    从 1.2 版本开始,jQuery 拥有对 JSONP 回调的本地支持。如果指定了 JSONP 回调,就可以加载位于另一个域的 JSON 数据,回调的语法为:url?callback=?。jQuery 自动将 ? 替换为要调用的生成函数名。

 

jQuery回调函数:

 

jQuery.getJSON(url+"&callback=?", function(data) {
    alert("Name: " + data.name + ", Phone: " + data.phone);
});

    为此,jQuery 将一个全局函数附加到插入脚本时需要调用的窗口对象。另外,jQuery 也能优化非跨域调用。如果向同一个域发出请求,jQuery 就将其转化为普通 Ajax 请求。

 

5. JSONP的安全问题

    在JavaScript 程序中有多种方法可动态地生成代码,最著名的函数之一就是 eval()。该函数允许您将任意字符串做为 JavaScript 代码执行。然而,随意使用该函数是非常危险的。遗憾的是,一些使用广泛的 JavaScript 库在内部都直接使用 eval() 函数。JSON本身是安全的,不含有赋值和调用。但由于 JSON 是以 JavaScript 的一个子集为基础的,所以脚本内容会潜在地包含恶意代码。由于许多 JavaScript 库使用 eval() 函数将 JSON 转换成 JavaScript 对象,利用这点,攻击者就可以向这些库发送畸形的 JSON 对象,这样 eval() 函数就会执行这些恶意代码。为保护 JSON 的使用,可使用RFC 4627 中所定义的正则表达式确保 JSON 数据中不包含活动的部分。 

 

JavaScript代码:

 

var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(  
             text.replace(/"(\\.|[^"\\])*"/g, ''))) &&  
         eval('(' + text + ')'); 

 

6. JSONP的缺陷

 

    JSONP 是构建 mashup 的强大技术,但不幸的是,它并不是所有跨域通信需求的万灵药。它有一些缺陷,必须认真考虑它们。

    第一,也是最重要的一点,没有关于 JSONP 调用的错误处理。如果动态脚本插入有效,就执行调用;如果无效,就静默失败。失败是没有任何提示的。例如,不能从服务器捕捉到 404 错误,也不能取消或重新开始请求。不过,等待一段时间还没有响应的话,就不用理它了。(未来的 jQuery 版本可能有终止 JSONP 请求的特性)。

   第二, JSONP 被不信任的服务使用时会很危险。因为 JSONP 服务返回打包在函数调用中的 JSON 响应,而函数调用是由浏览器执行的,这使宿主 Web 应用程序更容易受到各类攻击。如果打算使用 JSONP 服务,了解它能造成的威胁非常重要。

 

分享到:
评论

相关推荐

    解决jQuery使用JSONP时产生的错误

    什么是域,简单来说就是...JSONP简介 JSONP(JSON with Padding)是一种常用的跨域手段,但只支持JS脚本和JSON格式的数据。顾名思义,JSONP是利用JSON作为垫片,从而实现跨域请求的一种技术手段。其基本原理是利用HT

    JSONP跨域请求实例详解

    JSOP简介 JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而...

    酒店预订网站源码下载

    简介: 功能不错的酒店预订网站。依托汇通天下的酒店预订平台,整合近6000家国内酒店资源,实现酒店订单的即时确认。 易订宝(开源酒店预订网站.net 3.5编译,可改为2.0框架,基于HUBS1 JSON接口,带管理后台,带SEO...

    MovieInfoGen:在豆瓣页面上生成电影介绍信息用于 PT 发布

    使用 (支持 JSONP 跨域获取,虽然用户脚本可以不考虑跨域问题)获取评分,相比于 OMDb,无需 API Key,分数获取Swift,更新及时(1次/24h);https://p.media-imdb.com/static-content/documents/v1/title/tt${ID}/...

    jQuery Autocomplete简介_动力节点Java学院整理

    主要介绍了jQuery Autocomplete简介,jQuery UI Autocomplete是jQuery UI的自动完成组件,是我用过的最强大、最灵活的Autocomplete,它支持本地的Array/JSON数组、通过ajax请求的Array/JSON数组、JSONP、以及...

    WCFRest应用简介(博客源码)

    1.采用模板实现WCFRest;2.采用一般WCF服务的方式实现WCFRest以及客户端的调用。博客地址:http://blog.csdn.net/pfe_nova/article/details/39323977

    mymusic:一个让你意想不到的音乐app:musical_note::musical_note::musical_note:

    vue全家桶开发音乐app简介项目是用vuecli 2.9构建用vuecli 3.x的用户自行重构部分代码项目使用到的技术MVVM框架:Vue.js (版本2.x)状态管理:Vuex前端路由:Vue Router服务端通讯:axios、jsonp移动端滚动库:...

    基于socket.io+express实现多房间聊天

    socket.io简介 Socket.IO是一个开源的WebSocket库,它通过Node.js实现WebSocket服务端,同时也提供客户端JS库。Socket.IO支持以事件为基础的实时双向通讯,它可以工作在任何平台、浏览器或移动设备。 Socket.IO...

    Java经典面试题整理及答案详解(二)

    简介: 现在找工作,背面试题是一方面,但更重要的就是得把这些代码的前后因果关系了解的非常清楚,还是要多写代码多练习。 1. 使用InputStream用什么方法? 答:Read()方法 2. 在JQuery里面如何绑定一个事件? ...

    jQuery UI v1.12.1

    处理没有定义的选项的子元素(f67f929)对话框修正:支持弃用按钮选项(#15016,6c754b4)菜单修正:支持数字键盘的键盘输入(#15031,ac9ca9e)滑动补充:演示自定义手柄(#15023,51461d5)jQueryUI简介jQuery...

    QQMusic-Parse::thought_balloon: 纯 JS 解析 QQ 音乐的直链

    QQMusic-Parse简介原生 JS 实现的解析 QQ 音乐直链,并封装了一个 jsonp 函数用于代替 ajax 的 get 方法。用法引入使用 await parse(smid) 获取,其中 smid 为歌曲的唯一标识:推荐配合 Aplayer 使用截图Chrome 插件...

    高级JSON表单规范第1章:简介

    JSON表单规范

    Ajax从入门到进阶视频课程(通俗易懂)

    课程内容包括:1.Ajax简介和原理2.Ajax基本用法3.使用jQuery实现Ajax4.JSON数据的处理5.Ajax跨域问题6.JSONP原理和用法7.artTemplate模板引擎8.访问聚合平台9.综合案例 教学全程以代码案例的形式讲解,通俗易懂!!...

    初学者必看的Ajax总结篇

    一、Ajax简介、优劣势、应用场景以及技术 Ajax简介 : Asynchronous Javascript And XML (异步的JavaScript和XML) 它并不是一种单一的技术,而是有机利用一系列交互式网页应用相关的技术所形成的结合体 AJAX 是...

    JSON模式简介

    JSON模式可能是处理JSON文件中大多数问题的答案。 我们从实际的角度探讨JSON Schema。

    JavaScript权威指南(第六版) 清晰-完整

    作者简介  David Flanagan是一名程序员,也是一名作家,它的个人网站是 。他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》...

    JavaScript权威指南(第6版)中文文字版

    18.2 借助[script]发送http请求:jsonp 505 18.3 基于服务器端推送事件的comet技术 508 第19章 jquery类库 514 19.1 jquery基础 515 19.2 jquery的getter和setter 522 19.3 修改文档结构 528 19.4 使用jquery处理...

    精通AngularJS part1

    作者简介 Pawel Kozlowski有15年以上的Web开发经验,接触过多种Web技术、语言和平台。他精通客户端和服务器端编程,并始终在寻找能提高生产率的工具和流程。Pawel是自由和开源软件的坚定支持者,他在AngularJS 社区...

Global site tag (gtag.js) - Google Analytics