什么原因使jsonp诞生? 

传说,浏览器有一个很重要的安全限制,叫做"同源策略"。同源是指,域名,协议,端口相同。举个例子,用一个浏览器分别打开了百度和谷歌页面,百度页面在执行脚本的时候就会检查这个脚本是否属于百度页面,只有和百度同源的脚本才会执行,这就是同源策略。(相当于给脚本按了一个大门,只允许在大门内部活动)

但是我们在工作中有时又会需要和不同域名的网站进行交流,由于同源策略的限制,使操作变得有些困难。jsonp是目前比较主流的跨域方式。什么是jsonp呢?我们来了解一下。

 

 jsonp和json有什么关系吗?

jsonp(JSON with Padding)和json很像,但却完全不是一回事儿。json和xml有些类似,是用于存储和表达数据的一种方式,也是javascript对象的表示。而jsonp是获取、传递数据的一种方式。打个比方,在早前的飞鸽传书,大家都知道吧?json相当于传递的书信,而jsonp是携带书信的飞鸽。这么一说,相信大家就都明白了!^_^

 jsonp的原理是什么?

整体来说,jsonp实现跨域的原理是跨域的服务端把客户端所需要的数据放进客户端本地的一个js方法里,进行调用,客户端在本地的js对返回的数据进行处理。这样就实现了不同域名下的两个站点间的交流。

由于<script>标签的src可以跨域,利用这一点,就有了jsonp这种非正式传输协议。因为有可能是多个不同站点都要访问这个服务端,那么各个站点要调用的方法可能是各不相同的,如果把方法名写死的话,就会很不和谐。所以解决的办法是各个站点来访问服务端时,在url中带一个参数(callback)过来,服务端获取到这个参数,就会在生成js代码时,以这个callback参数作为方法名,再把数据放到这个方法里。这样各个站点就可以调用各自的方法了。这也是jsonp的一个要点。

jsonp实现方式

写一个模拟jsonp原理的一个简单的例子

本地客户端:

<script type="text/javascript" src="http://example.com/Index.aspx?callback=Hello"></script>

本地回调函数

function Hello(data){

     alert(data.result);

}

跨域服务端:

protected void Page_Load(object sender, EventArgs e)
{ string callback=Request.QueryString["callback"];//获取客户端回调函数名,值为"Hello" Response.Write(callback+"({result:1})"); //调用客户端指定函数,并把数据传进去 }

简单的jsonp实现跨域原理的更多相关文章

  1. jsonp的跨域原理

    在开发测试中,难免会在不同域下进行跨域操作,出于安全性考虑,浏览器中的同源策略阻止从一个域上加载的脚本获取或者操作 另一个域下的文档属性,这时需要进行跨域的方式进行解决,如:使用jsonp ,ifra ...

  2. 跨域解决方案二:使用JSONP实现跨域

    跨域的实现方式有多种,除了 上篇文章 提到的CORS外,常见的还有JSONP.HTML5.Flash.iframe.xhr2等. 这篇文章对JSONP的跨域原理进行了探索,并将我的心得记录在这里和大家 ...

  3. 使用XHR2或Jsonp实现跨域以及实现原理

    我们直接使用XMLHttpRequset请求外部接口 会发现 报这个错误 其实浏览器成功发送请求并拿回了数据  只是浏览器的同源策略 禁止了获取  在xhr2 服务器端支持跨域 需要在响应头增加 Ac ...

  4. jsonp跨域原理解析

    前言: 跨域请求是前台开发中经常遇到的场景,但是由于浏览器同源策略,导致A域下普通的http请求没法加载B域下的数据,跨域问题由此产生.但是通过script标签的方式却可以加载非同域下的js,因此可以 ...

  5. ajax跨域原理以及解决方案

    说明 跨域主要是由于浏览器的“同源策略”引起,分为多种类型,本文主要探讨Ajax请求跨域问题 前言 强烈推荐阅读参考来源中的文章,能够快速帮助了解跨域的原理 参考来源 本文参考了以下来源 浏览器同源政 ...

  6. 转(JSONP处理跨域事件)

     前言: 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Soc ...

  7. Ajax跨域原理及JQuery中的实现

    浅析Ajax跨域原理及JQuery中的实现分析   AJAX 的出现使得网页可以通过在后台与服务器进行少量数据交换,实现网页的局部刷新.但是出于安全的考虑,ajax不允许跨域通信.如果尝试从不同的域请 ...

  8. 使用JSONP实现跨域

    什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通 ...

  9. JSONP解决跨域问题,什么是JSONP(转)

    原文链接:https://www.cnblogs.com/xinxingyu/p/6075881.html 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的 ...

随机推荐

  1. 实现一个简易的express中间件

    代码: // 通过闭包实现单例 const Middlewave = (function(){ let instance; class Middlewave{ constructor() { this ...

  2. 第七周 Leetcode 466. Count The Repetitions 倍增DP (HARD)

    Leetcode 466 直接给出DP方程 dp[i][k]=dp[i][k-1]+dp[(i+dp[i][k-1])%len1][k-1]; dp[i][k]表示从字符串s1的第i位开始匹配2^k个 ...

  3. Python print 输出不换行,只有空格

    for x in open("/home/soyo/桌面/中期内容/6.txt"): print x, ,,,]: print x, #print 输出没有换行,只有空格 结果: ...

  4. EasyUI 取得选中行数据

    转自:http://www.jeasyui.net/tutorial/23.html 本实例演示如何取得选中行数据. 数据网格(datagrid)组件包含两种方法来检索选中行数据: getSelect ...

  5. JForum论坛添加UEditor文本编辑器

    在使用JForum论坛中发现论坛自带的文本编辑器不好用,不能上传图片,样式编辑也很麻烦,就想着把这个文本编辑器替换掉,我这里选用的是百度的开源富文本编辑器UEditor 替换后的效果图 替换方法如下 ...

  6. Android网络相关代码

    /** * 获取本机的Ip * * @return */ public String getLocalIpAddress() { try { for (Enumeration<NetworkIn ...

  7. Java源码——String

    最近在研究java的源代码,但是由于自己英语水平有限,所以想使用中文注释的方式把源码里的方法全部重写 一遍,下面是楼主整理出来的一小部分.我把整体的项目托管到GitHub上了,欢迎大家前去交流学习. ...

  8. SVN报错 Not Found In Revision 不支持空目录

    如果你要初始化上传的SVN目录为空,有可能会报这个错误 解决方法:在SVN下新建一个目录即可

  9. js实现页面的全屏与退出

    1.在data里面定义: data(){ return{ isScreen:false, } } //是否显示全屏 fullScreen(event){ this.isScreen = !this.i ...

  10. Linux安装PHP环境

    简介: PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要 ...