- 浏览: 933073 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (251)
- WebService (17)
- IBatis (22)
- Hibernate (1)
- SpringMVC - 基础篇 (32)
- Spring (15)
- Java (11)
- JVM及调优 - 基础篇 (4)
- 集群 (14)
- 数据库 (17)
- WebSphere (5)
- 多线程 (4)
- 集合、容器 (2)
- DB Pool (1)
- Power Designer (5)
- Maven基础 (5)
- JS (14)
- WEB 前端 (5)
- 实用小工具 (17)
- 社会、人 (2)
- 乱七八糟 (18)
- ASM&CGLIB - 基础篇 (12)
- 缓存 (1)
- 性能 (1)
- 设计之殇 (1)
- 分布式事务 (1)
- 单点登录 (11)
- 分布式 Session (4)
- Memcached - 基础篇 (6)
最新评论
-
一笑_奈何:
楼主写的还真行不错。
扫盲贴 - J2EE集群之JNDI集群实现 -
xuezhongyu01:
博主写的很详细,但最后还是没明白,最后调用BasicDataS ...
Spring中的destroy-method方法 -
Mr梁:
commons-fileupload.jar commons- ...
SpringMVC 中文件上传 MultipartResolver -
Eywa:
总结的很不错
ORACLE CASE WHEN 及 SELECT CASE WHEN的用法 -
TryRelax:
fastjson 比 jackson 好用吧?
Spring MVC Jackson DateFormat
一、为什么有跨域的问题
跨域问题存在实际上源于浏览器的同源策略(same origin policy),简单讲,同源就是要求域名,协议,端口三者都一致;而同源策略就是指页面上的脚本不能访问非同源的资源(包括HTTP响应和Cookie);上面给出了维基百科的地址,如果无法正常访问请移步这里:same origin policy
很多人会想到一个很熟悉的东西:document.domain 同源策略有点放松的就是:b.a.com上的页面无法通过a.com的同源验证,但是设置b.a.com页面的document.domain属性为a.com,就可以通过浏览器对a.com的同源检测;但是,document.domain只允许设置成更上级的域名,而不是其它域名,例如c.com就不行; 提到这里很多人都会想到多级域名下共享Cookie的路子就是把Cooki设置成上级域名;在Web2.0的时代,这种本质上同域跨级解决方案远远不能满足我们跨域的需求;
二、什么引起了ajax跨域不能的问题
ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,会警告,所以才出现ajax跨域的问题。
三、JSONP是怎么产生的
其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,小可不才,试着用自己的方式来阐释一下这个问题,看看是否有帮助。
1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;
2、不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>);
3、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理;
4、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据;
5、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。
6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。
7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
如果对于callback参数如何使用还有些模糊的话,我们后面会有具体的实例来讲解。
四、iframe、JS创建动态脚本和JQuery跨域访问解决方案
一)、使用IFRAME。
在页面内嵌或动态生成指向别的网站的IFRAME,然后这两个网页间可以通过改变对方的anchor hash fragment来传输消息。改变一个网页的anchor hash fragment并不会使浏览器重新装载网页,所以一个网页的状态得以保持,而网页本身则可以通过一个计时器(timer)来察觉自己anchor hash的变化,从而相应改变自己的状态。
现在将IFRAME的方法简单示范如下:
. http://domain1/Cross1.html:
<html> <head> <script language="javascript" type="text/javascript"> var url = "http://domain2/Cross2.html" var oldHash = null; var timer = null; function getHash() { var hash = window.location.hash; if ((hash.length >= 1) && (hash.charAt(0) == '#')) { hash = hash.substring(1); } return hash; } function sendRequest() { var d = document; var t = d.getElementById('request'); var f = d.getElementById('alienFrame'); f.src = url + "#" + t.value + "<br/>" + new Date(); } function setDivHtml(v) { var d = document; var dv = d.getElementById('response'); dv.innerHTML = v; } function idle() { var newHash = getHash(); if (newHash != oldHash) { setDivHtml(newHash); oldHash = newHash; } timer = window.setTimeout(idle, 100); } function window.onload() { timer = window.setTimeout(idle, 100); } </script> </head> <body> 请求:<input type="text" id="request"> <input type="button" value="发送" onclick="sendRequest()" /><br/> 回复:<div id="response"></div> <iframe id="alienFrame" src="http://domain2/Cross2.html"></iframe> </body> </html>
2. http://domain2/Cross2.html:
<html> <head> <script language="javascript" type="text/javascript"> var url = "http://domain1/Cross1.html" var oldHash = null; var timer = null; function getHash() { var hash = window.location.hash; if ((hash.length >= 1) && (hash.charAt(0) == '#')) { hash = hash.substring(1); } return hash; } function sendRequest() { var d = document; var t = d.getElementById('request'); var f = parent; //alert(f.document); //试着去掉这个注释,你会得到“Access is denied” f.location.href = url + "#" + t.value + "<br/>" + new Date(); } function setDivHtml(v) { var d = document; var dv = d.getElementById('response'); dv.innerHTML = v; } function idle() { var newHash = getHash(); if (newHash != oldHash) { setDivHtml(newHash); oldHash = newHash; } timer = window.setTimeout(idle, 100); } function window.onload() { timer = window.setTimeout(idle, 100); } </script> </head> <body> 请求:<input type="text" id="request"> <input type="button" value="发送" onclick="sendRequest()" /><br/> 回复:<div id="response"></div> </body> </html>
两个网页基本相同,第一个网页内嵌一个IFRAME,在点击“发送”按钮后,会将文本框里的内容通过hash fragment传给IFRAME。点击IFRAME里的“发送”按钮后,它会将文本框里的内容通过hash fragment传给父窗口。因为是只改动了hash fragment,浏览器不会重新load网页内容,这里使用了一个计时器来检测URL变化,如果变化了,就更新其中一个div的内容 。
二)、jquery跨域访问解决方案
客户端“跨域访问”一直是一个头疼的问题,好在有jQuery帮忙,从jQuery-1.2以后跨域问题便迎刃而解。由于自己在项目中遇到跨域问题,借此机会对跨域问题来刨根问底,查阅了相关资料和自己的实践,算是解决了跨域问题。便记录下来,以供查阅。
jQuery.ajax()支持get方式的跨域,这其实是采用jsonp的方式来完成的。
$.ajax({
async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL type: 'GET', dataType: 'jsonp', jsonp: 'jsoncallback', //默认callback data: mydata, timeout: 5000, beforeSend: function(){
//jsonp 方式此方法不被触发。原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了 }, success: function (json) {
//客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,
//会动态执行这个callback函数 if(json.actionErrors.length!=0){ alert(json.actionErrors); } genDynamicContent(qsData,type,json); }, complete: function(XMLHttpRequest, textStatus){ $.unblockUI({ fadeOut: 10 }); }, error: function(xhr){ //jsonp 方式此方法不被触发 //请求出错处理 alert("请求出错(请检查相关度网络状况.)"); } });
注意:
$.getJSON(" http://www.mysite.com/demo.do?name1="+value1+"&callback=?",
function(json){ if(json.属性名==值){ // 执行代码 } });
这种方式其实是上例$.ajax({..}) api的一种高级封装,有些$.ajax api底层的参数就被封装而不可见了。
JSONP的客户端具体实现:
不管jQuery也好,extjs也罢,又或者是其他支持jsonp的框架,他们幕后所做的工作都是一样的,下面我来循序渐进的说明一下jsonp在客户端的实现:
1、我们知道,哪怕跨域js文件中的代码(当然指符合web脚本安全策略的),web页面也是可以无条件执行的。
远程服务器remoteserver.com根目录下有个remote.js文件代码如下:
alert('我是远程文件');
本地服务器localserver.com下有个jsonp.html页面代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript" src="http://remoteserver.com/remote.js"></script> </head> <body> </body> </html>
毫无疑问,页面将会弹出一个提示窗体,显示跨域调用成功。
2、现在我们在jsonp.html页面定义一个函数,然后在远程remote.js中传入数据进行调用。
jsonp.html页面代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript"> var localHandler = function(data){ alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result); }; </script> <script type="text/javascript" src="http://remoteserver.com/remote.js"></script> </head> <body> </body> </html>
remote.js文件代码如下:
localHandler({"result":"我是远程js带来的数据"});
运行之后查看结果,页面成功弹出提示窗口,显示本地函数被跨域的远程js调用成功,并且还接收到了远程js带来的数据。很欣喜,跨域远程获取数据的目的基本实现了,但是又一个问题出现了,我怎么让远程js知道它应该调用的本地函数叫什么名字呢?毕竟是jsonp的服务者都要面对很多服务对象,而这些服务对象各自的本地函数都不相同啊?我们接着往下看。
3、聪明的开发者很容易想到,只要服务端提供的js脚本是动态生成的就行了呗,这样调用者可以传一个参数过去告诉服务端“我想要一段调用XXX函数的js代码,请你返回给我”,于是服务器就可以按照客户端的需求来生成js脚本并响应了。
看jsonp.html页面的代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript"> // 得到航班信息查询结果后的回调函数 var flightHandler = function(data){ alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。'); }; // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码) var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler"; // 创建script标签,设置其属性 var script = document.createElement('script'); script.setAttribute('src', url); // 把script标签加入head,此时调用开始 document.getElementsByTagName('head')[0].appendChild(script); </script> </head> <body> </body> </html>
这次的代码变化比较大,不再直接把远程js文件写死,而是编码实现动态查询,而这也正是jsonp客户端实现的核心部分,本例中的重点也就在于如何完成jsonp调用的全过程。
我们看到调用的url中传递了一个code参数,告诉服务器我要查的是CA1998次航班的信息,而callback参数则告诉服务器,我的本地回调函数叫做flightHandler,所以请把查询结果传入这个函数中进行调用。
OK,服务器很聪明,这个叫做flightResult.aspx的页面生成了一段这样的代码提供给jsonp.html(服务端的实现这里就不演示了,与你选用的语言无关,说到底就是拼接字符串):
flightHandler({ "code": "CA1998", "price": 1780, "tickets": 5 });
我们看到,传递给flightHandler函数的是一个json,它描述了航班的基本信息。运行一下页面,成功弹出提示窗口,jsonp的执行全过程顺利完成!
4、到这里为止的话,相信你已经能够理解jsonp的客户端实现原理了吧?剩下的就是如何把代码封装一下,以便于与用户界面交互,从而实现多次和重复调用。
什么?你用的是jQuery,想知道jQuery如何实现jsonp调用?好吧,那我就好人做到底,再给你一段jQuery使用jsonp的代码(我们依然沿用上面那个航班信息查询的例子,假定返回jsonp结果不变):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Untitled Page</title> <script type="text/javascript" src=jquery.min.js"></script> <script type="text/javascript"> jQuery(document).ready(function(){ $.ajax({ type: "get", async: false, url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998", dataType: "jsonp",
//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)jsonp: "callback",
//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",//jQuery会自动为你处理数据
jsonpCallback:"flightHandler", success: function(json){ alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。'); }, error: function(){ alert('fail'); } }); }); </script> </head> <body> </body> </html>
是不是有点奇怪?为什么我这次没有写flightHandler这个函数呢?而且竟然也运行成功了!哈哈,这就是jQuery的功劳了,jquery在处理jsonp类型的ajax时(还是忍不住吐槽,虽然jquery也把jsonp归入了ajax,但其实它们真的不是一回事儿),自动帮你生成回调函数并把数据取出来供success属性方法来调用,是不是很爽呀?
对ajax与jsonp的异同再做一些补充说明:
1、ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装;
2、但ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本。
3、所以说,其实ajax与jsonp的区别不在于是否跨域,ajax通过服务端代理一样可以实现跨域,jsonp本身也不排斥同域的数据的获取。
4、还有就是,jsonp是一种方式或者说非强制性协议,如同ajax一样,它也不一定非要用json格式来传递数据,如果你愿意,字符串都行,只不过这样不利于用jsonp提供公开服务。
总而言之,jsonp不是ajax的一个特例,哪怕jquery等巨头把jsonp封装进了ajax,也不能改变着一点!
整理于网络资料。
- crossdomain-ajax.rar (92.9 KB)
- 下载次数: 53
评论
我写了一个demo,服务用wcf,客户端用html,部署在tomcat里面,请求后,服务器可以返回数据并且我用了httpfox工具查看了,请求有返回content,数据也正常,凡是返回后没有调用我设置的callback函数,不知道为啥.
能不能给小弟指点一二,谢谢
不知道怎么插入图片,只能放入链接了,烦请楼主给我指点一二啊!
检查下 content中的数据,数据格式是不是有问题?
返回过来完整的字符串是:"eval(\"handleIDCard({\"address\":\"address\",\"birth\":\"2011-02-11\",\"endDate\":\"2011-02-10\",\"errorMessage\":\"errorMessage\",\"id\":\"id\",\"imagePath\":\"imagePath\",\"name\":\"name\",\"nation\":\"nation\",\"newAddress\":\"newAddress\",\"result\":\"result\",\"sex\":\"sex\",\"signGov\":\"signGov\",\"startDate\":\"2011-02-13\"})\");"
去除红色的字符串js可以单独运行,但是我也试过前面不加eval,返回回来也不能调用。
我写了一个demo,服务用wcf,客户端用html,部署在tomcat里面,请求后,服务器可以返回数据并且我用了httpfox工具查看了,请求有返回content,数据也正常,凡是返回后没有调用我设置的callback函数,不知道为啥.
能不能给小弟指点一二,谢谢
不知道怎么插入图片,只能放入链接了,烦请楼主给我指点一二啊!
检查下 content中的数据,数据格式是不是有问题?
我写了一个demo,服务用wcf,客户端用html,部署在tomcat里面,请求后,服务器可以返回数据并且我用了httpfox工具查看了,请求有返回content,数据也正常,凡是返回后没有调用我设置的callback函数,不知道为啥.
能不能给小弟指点一二,谢谢
不知道怎么插入图片,只能放入链接了,烦请楼主给我指点一二啊!
我写了一个demo,服务用wcf,客户端用html,部署在tomcat里面,请求后,服务器可以返回数据并且我用了httpfox工具查看了,请求有返回content,数据也正常,凡是返回后没有调用我设置的callback函数,不知道为啥.
能不能给小弟指点一二,谢谢
http://dl.iteye.com/upload/picture/pic/126431/aa4f0bf3-f72a-3a75-99ac-bd884f1f1507.jpg
我写了一个demo,服务用wcf,客户端用html,部署在tomcat里面,请求后,服务器可以返回数据并且我用了httpfox工具查看了,请求有返回content,数据也正常,凡是返回后没有调用我设置的callback函数,不知道为啥.
能不能给小弟指点一二,谢谢
发表评论
-
treegrid控件按条件查询和重加载的实现
2013-02-21 15:51 1807转载:http://www.iteye.com/topic/ ... -
TABLE 多表头固定问题(基本jquery插件)
2013-02-21 15:33 1851转载:http://www.cnblogs.com/dat ... -
Ext RowEditer.js 报错误this.items is undefined
2012-02-15 09:50 1615var editor = new Ext.ux.grid ... -
Extjs3.3.1扩展组件 BufferView
2012-02-07 11:34 2131一、现状情况 目前遇到一个这样的需求:大概有几千多 ... -
Extjs Tree简单使用
2012-01-11 11:35 4013一、 效果图: js部分: var ... -
全同运算符 "==="
2012-01-11 10:44 978在JavaScript中,"==="是全同 ... -
Ext 统计行
2011-12-08 14:06 1410统计行不参与grid中行的排序。 ExtJs统计行展示 ... -
ExtJS中Ext.Ajax.request与form1.getForm().submit
2011-11-20 00:10 2145相同点:都属于Ajax提交方式! 不同点:Ext.Aja ... -
EXT提交服务器的三种方式
2011-11-19 18:24 2064一、 EXT提交服务器的三种方式 1. EXT的form ... -
Ext出现的问题:this.dom is undefined
2011-11-14 15:08 4102问题描述: 首先一个带有grid的页面,此页面弹 ... -
JSP引入含有ExtJs定义的组件的js文件并同步请求
2011-10-27 11:05 3004经常遇到这样的情况 ... -
js取当前url参数
2011-07-20 17:20 1995js没有提供取当前url参数的方法,只能是自己从中截取了,在网 ... -
ajax同步请求和异步请求
2011-07-02 11:18 3744ajax同步和异步的差异, 先看2段代码: 代码一: ...
相关推荐
### Ajax跨域问题解决方案 #### 一、什么是Ajax跨域 **原理:** Ajax跨域问题的核心在于浏览器的“同源策略”。同源策略是一种安全措施,用于限制一个域名下的文档或脚本如何与另一个来源的资源进行交互。简单来说...
本文将深入探讨JavaScript和Ajax跨域的原理,以及常用的解决方案。 首先,理解同源策略是解决跨域问题的基础。同源策略是浏览器为了保障用户安全而设定的一种机制,它规定了只有同源(即协议、域名和端口都相同)的...
本教程将重点讲解如何在ASP.NET Web环境中处理Ajax跨域访问。 一、理解同源策略 同源策略是浏览器为了保护用户安全而实施的一项安全机制,它禁止了一个源(domain)的文档或脚本获取或操作另一个源的资源。这意味着...
### Ajax跨域问题及其解决方案 #### 一、Ajax跨域问题概述 在现代Web开发中,前后端分离架构越来越流行。这种模式下,前端页面与后端服务通常部署在不同的服务器上,甚至可能位于不同的域名下。当浏览器发起对不同...
在实际应用中,开发者通常根据项目需求和服务器环境选择合适的跨域解决方案。例如,CORS是最推荐的方式,因为它提供了更灵活的安全控制,而JSONP则适用于那些无法修改服务器端代码的场景。服务器代理方法在某些情况...
jQuery作为流行的JavaScript库,提供了一些机制来处理跨域访问。 JQuery的跨域解决方案主要依赖于JSONP(JSON with Padding)技术。JSONP是一种绕过同源策略的方式,它利用HTML中的`<script>`标签没有同源策略限制...
### JAVA的AJAX跨域访问:深入解析与解决方案 #### 引言 在现代Web开发中,AJAX(Asynchronous JavaScript and XML)技术被广泛应用于实现网页的异步加载,从而提升用户体验。然而,AJAX请求的一个常见问题就是...
### 如何实现Ajax跨域访问 在Web开发中,由于同源策略的限制,JavaScript只能对同源的页面进行操作,不能对不同源的页面进行请求。然而,在实际的应用场景中,经常会出现需要向不同域名下的服务器发起请求的情况。...
JS 跨域访问解决方案总结 JS 跨域访问解决方案总结是指在不同域名站点之间进行资源访问的解决方案。默认情况下,脚本访问文档属性等数据采用的是同源策略(Same origin policy),即如果两个页面的协议、域名和端口...
如果直接使用ajax访问,会有以下错误: XMLHttpRequest cannot load http://server.runoob.com/server.php. No ‘Access-Control-Allow-Origin’ header is present on the requested resource.Origin ...
本文将深入探讨JS跨域的解决方案,帮助开发者理解并解决这个问题。 首先,我们需要了解什么是同源策略。同源策略是浏览器为了保护用户数据安全而实施的一项机制,它限制了来自不同源的脚本之间进行交互。然而,这在...
**jQuery实现Ajax跨域访问** 在Web开发中,由于浏览器的同源策略限制,JavaScript通常只能访问与当前页面同一域名下的资源。然而,有时我们需要从不同的域名获取数据,例如使用第三方API服务,这时就需要借助Ajax的...
本文将详细探讨两种主要的Ajax跨域访问解决方法:JSONP和CORS。 **1. JSONP(JSON with Padding)** JSONP是一种非官方的跨域数据交互协议,它利用了`<script>`标签不受同源策略限制的特点。JSONP的工作原理是:...
**Ajax跨域详解** 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术允许我们实现页面的...通过分析这些文件,开发者可以更好地理解和实践Ajax跨域的解决方案,确保在实际项目中能够顺利地进行跨域数据交互。
在实际项目中,开发者需要根据具体情况选择合适的跨域解决方案。例如,JSONP适用于简单的GET请求,而CORS则更通用,支持各种HTTP方法。同时,注意跨域安全问题,避免因不当配置导致的安全风险。
解决ajax跨域问题有多种方法,以下是几种常见的解决方案: 1. 使用中间层过渡的方式 这种方法是通过在ajax请求和不同域的服务器之间加一层中间层来解决跨域问题。中间层可以是php、jsp、c++等任何具备网络通讯功能...
### JSONP实现Ajax跨域访问 #### 一、引言 JSONP(JSON with Padding)是一种用于解决跨域数据访问的技术。由于同源策略(Same-Origin Policy)的存在,JavaScript/Ajax只能请求同源的资源,这给需要跨域访问数据...