赏识器端跨域会见一向是个题目, 大都研发职员看待js的立场都是好了伤疤忘了疼,以是病发的时辰,时不时地都要疼上一疼.记得好久早年行使iframe 加script domain 声明,yahoo js util 的方法办理二级域名跨域会见的题目.
时刻过得好快,又被拉回js沙场时, 跨域题目这个伤疤又开疼了.
亏得,有jquery资助,跨域题目好像没那么难缠了.这次也借此机遇对跨域题目来给刨根问底,团结现实的开拓项目,查阅了相干资料,算是办理了跨域题目..有须要记下来备忘.
跨域的安详限定都是指赏识器端来说的.处事器端是不存在跨域安详限定的, 以是通过本机处事器端通过相同httpclient方法完成“跨域会见”的事变,然后在赏识器端用AJAX获取本机处事器端“跨域会见”对应的url.来间接完成跨域会见也是可以的.但很显然开拓量较量大,但限定也起码,许多widget开放平台server端(如sohu博客开放平台)着实就么搞的.不在本次接头范畴.
要接头的是赏识器端的真正跨域会见,保举的是今朝jQuery $.ajax()支持get方法的跨域,这着实是回收jsonp的方法来完成的.
真实案例:
var qsData = {'searchWord':$("#searchWord").attr("value"),'currentUserId':$("#currentUserId").attr("value"),'conditionBean.pageSize':$("#pageSize").attr("value")};
$.ajax({ async:false, url: http://跨域的dns/document!searchJSONResult.action, type: "GET", dataType: 'jsonp', jsonp: 'jsoncallback', data: qsData, 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 方法此要领不被触发.缘故起因也许是dataType假如指定为jsonp的话,就已经不是ajax变乱了 //哀求堕落处理赏罚 alert("哀求堕落(请搜查相干度收集状况.)"); } }); 留意:$.getJSON(" http://跨域的dns/document!searchJSONResult.action?name1="+value1+"&jsoncallback=?", function(json){ if(json.属性名==值){ // 执行代码 } }); 这种方法着实是上例$.ajax({..}) api的一种高级封装,有些$.ajax api底层的参数就被封装而不行见了. 这样,jquery就会拼装成如下的url get哀求 http://跨域的dns/document!searchJSONResult.action?&jsoncallback=jsonp1236827957501&_=1236828192549&searchWord=%E7%94%A8%E4%BE%8B¤tUserId=5351&conditionBean.pageSize=15
在相应端(http://跨域的dns/document!searchJSONResult.action), 通过 jsoncallback = request.getParameter("jsoncallback") 获得jquery端随后要回调的js function name:jsonp1236827957501 然后 response的内容为一个Script Tags:"jsonp1236827957501("+按哀求参数天生的json数组+")"; jquery就会通过回调要领动态加载挪用这个js tag:jsonp1236827957501(json数组); 这样就到达了跨域数据互换的目标.
jsonp的最根基的道理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限定的。这样说来,这种跨域方法着实与ajax XmlHttpRequest协议无关了. 这样着实"jQuery AJAX跨域题目"就成了个伪命题了,jquery $.ajax要领名有误导人之嫌. 假如设为dataType: 'jsonp', 这个$.ajax要领就和ajax XmlHttpRequest没什么相关了,取而代之的则是JSONP协议. JSONP是一个非官方的协议,它应承在处事器端集成Script tags返回至客户端,通过javascript callback的情势实现跨域会见 JSONP即JSON with Padding。因为同源计策的限定,XmlHttpRequest只应承哀求当前源(域名、协议、端口)的资源。假如要举办跨域哀求, 我们可以通过行使html的script标志来举办跨域哀求,并在相应中返回要执行的script代码,个中可以直接行使JSON转达javascript工具。 这种跨域的通信方法称为JSONP。
jsonCallback 函数jsonp1236827957501(....): 是赏识器客户端注册的,获取跨域处事器上的json数据后,回调的函数
Jsonp道理:
起首在客户端注册一个callback (如:'jsoncallback'), 然后把callback的名字(如:jsonp1236827957501)传给处事器。
此时,处事器天赋生 json 数据。
然后以 javascript 语法的方法,天生一个function , function 名字就是转达上来的参数 'jsoncallback'的值 jsonp1236827957501 .
最后将 json 数据直接以入参的方法,安排到 function 中,这样就天生了一段 js 语法的文档,返回给客户端。
客户端赏识器,理会script标签,并执行返回的 javascript 文档,此时javascript文档数据,作为参数, 传入到了客户端预先界说好的 callback 函数(如上例中jquery $.ajax()要领封装的的success: function (json))里.(动态执行回调函数)
可以说jsonp的方法道理上和<script src="http://跨域/...xx.js"></script>是同等的(qq空间就是大量回收这种方法来实现跨域数据互换的) .JSONP是一种剧本注入(Script Injection)举动,以是也有必然的安详隐患.
留意,jquey是不支持post方法跨域的. 为什么呢? 固然回收post +动态天生iframe是可以到达post跨域的目标(有位js牛人就是这样把jquery1.2.5 打patch的),但这样做是一个较量极度的方法,不提议回收. 也可以说get方法的跨域是正当的,post方法从安详角度上,被以为是不正当的, 万不得已照旧不要剑走偏锋..
client端跨域会见的需求看来也引起w3c的留意了,看资料说html5 WebSocket尺度支持跨域的数据互换,应该也是一个未来可选的跨域数据互换的办理方案.
出自:http://www.cnblogs.com/Gaton/ (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|