JSONP原理

  • JSONP原理

 

JSON和JSONP

  JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。对于JSON大家应该是很了解了吧,不是很清楚的朋友可以去json.org上了解下,简单易懂。

  JSONP是JSON with Padding的略称。它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

  JSONP就像是JSON+Padding一样(Padding这里我们理解为填充), 我们先看下面的小例子然后再详细介绍。

 

同源策略

 

在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略)。这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容。

根据这个策略,在baidu.com下的页面中包含的JavaScript代码,不能访问在google.com域名下的页面内容;甚至不同的子域名之间的页面也不能通过JavaScript代码互相访问。对于Ajax的影响在于,通过XMLHttpRequest实现的Ajax请求,不能向不同的域提交请求,例如,在abc.example.com下的页面,不能向def.example.com提交Ajax请求,等等。然而,当进行一些比较深入的前端编程的时候,不可避免地需要进行跨域操作,这时候"同源策略"就显得过于苛刻。

 

然而html中有一些元素是不存在跨域问题的如:script,iframe等元素,利用这些元素,就能很好的解决这个问题.

 

JSONP的实现方式

利用在页面中创建<script>节点的方法向不同域提交HTTP请求,这项技术就可以解决跨域提交Ajax请求的问题。

 

先看一个简单例子

现有系统example1.com有这样一个方法

<script type="text/javascript">
//回调函数
function callback(data) {
     //显示客户信息在A页面上;
 }
</script>

//通过加载example2的JS文件来达到函数调用和数据传递

<script type="text/javascript" src="http://example2.com/test.js"></script>

     example2.com的test.js内容如下

//回调函数
callback({name:"张三"});

以上这种方法只是一个简单实现原因的例子,现实中我们的数据和回调也不会都写死在JS中的,所以我们要想办法将这些静态的东西动态生成就可以了.只要将example1.com srcipt 地址改为一个能动态生成JS调用方法的服务地址即可.如:

<script type="text/javascript" src="http://example2.com/test.do"></script>,test.do直接返回如下

callback(数据库客户信息的JSON对象);

 



当然对<script type="text/javascript" src="http://example2.com/test.do">的调用,你也可以动态来创建script标签完成,这样就更灵活一些.

 

例子如下:

假若要实现一个需求,某个网站a.com上显示的客户信息来自于其它网站b.com,显然通过AJAX请求去取数据是不能做到的,因为存在同源策略.

  1. A网站的前台实现:

<script type="text/javascript">
//回调函数
function displayCustomer(data) {
     alert(data);

     //将客户信息显示在A.com的页面上...
 }

 

window.onload = function(){

     //添加<script>标签的方法
     function createScript(src){
         var script = document.createElement('script');
         script.setAttribute("type","text/javascript");
         script.src = src;
         document.body.appendChild(script);
     }

}

</script>

    createScript("http://B.com/search.do?&callback=displayCustomer");

  1. B网站的后台实现:

@Controller
public class JsonpRest {
    @RequestMapping(value = "/test.do", method = RequestMethod.GET)
    public
    @ResponseBody
    String list(HttpServletRequest request) {
        return request.getParameter("callback")+"({name:'张三',age:18})";
    }
}

 

JSONP的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。

JSONP的缺点则是:

1.     它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

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

 

  • JQUERY对JSONP的支持

从JQery 1.2以后,就开始支持JSONP的调用。JQuery对前台做了很好的处理如自动生成全局回调函数等,但后台还需要开发人员自己实现.

$.getJSON("http://跨域的dns/xxx.do?callback=?",function(json){           

    // 业务逻辑执行代码           

});

 

请求URL http://xxx.com/rest.do?callback=jQuery17207481773362960666_1332575486681&_=1393510789026

$.ajax({
        url:"http://xxx.com/rest.do",
        dataType:"jsonp",    //必须指定

        jsonp : "c",         //若不指定则默认为callback

        jsonpCallback:"test",//若不指定则Jquery自己生成随机的名称
        success:function(data){
            // 业务逻辑执行代码
        }
});

 

请求URL http://xxx.com/rest.do?c=test&_=1393510789026

JQUERY的实现原理及步骤

1. 当dataType为JSONP时,JQUERY会为用户生成一个全局函数名称为jsonpCallback参数的值,这个函数内部调用了success方法

2. 以GET方式请求目标地址,并在URL中拼接以jsonp参数值为key,以jsonpCallback值为value的参数

3. 请求返回回调函数数据

4. 触发调用全局的回调函数,在全局函数回调中调用success方法并将数据传递给success方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的精简博客系统,源码+数据库+毕业论文+视频演示 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前企业对于博客信息的管理和控制,采用人工登记的方式保存相关数据,这种以人力为主的管理模式已然落后。本人结合使用主流的程序开发技术,设计了一款基于Springboot开发的精简博客系统,可以较大地减少人力、财力的损耗,方便相关人员及时更新和保存信息。本系统主要使用B/S开发模式,在idea开发平台上,运用Java语言设计相关的系统功能模块,MySQL数据库管理相关的系统数据信息,SpringBoot框架设计和开发系统功能架构,最后通过使用Tomcat服务器,在浏览器中发布设计的系统,并且完成系统与数据库的交互工作。本文对系统的需求分析、可行性分析、技术支持、功能设计、数据库设计、功能测试等内容做了较为详细的介绍,并且在本文中也展示了系统主要的功能模块设计界面和操作界面,并对其做出了必要的解释说明,方便用户对系统进行操作和使用,以及后期的相关人员对系统进行更新和维护。本系统的实现可以极大地提高企业的工作效率,提升用户的使用体验,因此在现实生活中运用本系统具有很大的使用价值。 关键词:博客管理;Java语言;B/S结构;MySQL数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值