加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

用jQuery办理跨域会见的题目

发布时间:2018-08-20 14:52:40 所属栏目:业界 来源:站长网
导读:赏识器端跨域会见一向是个题目, 大都研发职员看待js的立场都是好了伤疤忘了疼,以是病发的时辰,时不时地都要疼上一疼.记得好久早年行使iframe 加script domain 声明,yahoo js util 的方法办理二级域名跨域会见的题目. 时刻过得好快,又被拉回js沙场时, 跨域

赏识器端跨域会见一向是个题目, 大都研发职员看待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&currentUserId=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/

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读