jQuery跨域访问问题解决方法

上传人:平*** 文档编号:12457452 上传时间:2017-10-19 格式:DOC 页数:4 大小:34KB
返回 下载 相关 举报
jQuery跨域访问问题解决方法_第1页
第1页 / 共4页
jQuery跨域访问问题解决方法_第2页
第2页 / 共4页
jQuery跨域访问问题解决方法_第3页
第3页 / 共4页
jQuery跨域访问问题解决方法_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《jQuery跨域访问问题解决方法》由会员分享,可在线阅读,更多相关《jQuery跨域访问问题解决方法(4页珍藏版)》请在金锄头文库上搜索。

1、jQuery 跨域访问问题解决方法作者: 字体:增加 减小 类型:转载浏览器端跨域访问一直是个问题, 多数研发人员对待 js 的态度都是好了伤疤忘了疼, 所以病发的时候,时不时地都要疼上一疼.记得很久以前使用 iframe 加 script domain 声明,yahoo js util 的方式解决二级域名跨域访问的问题.时间过得好快,又被拉回 js 战场时, 跨域问题这个伤疤又开疼了. 好在,有 jquery 帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅了相关资料,算是解决了跨域问题.有必要记下来备忘. 跨域的安全限制都是指浏览器端来说的.服

2、务器端是不存在跨域安全限制的 , 所以通过本机服务器端通过类似 httpclient 方式完成“跨域访问 ”的工作,然后在浏览器端用AJAX 获取本机服务器端 “跨域访问”对应的 url.来间接完成跨域访问也是可以的. 但很显然开发量比较大,但限制也最少,很多 widget 开放平台 server 端(如 sohu 博客开放平台)其实就么搞的.不在本次讨论范围. 要讨论的是浏览器端的真正跨域访问,推荐的是目前 jQuery $.ajax()支持 get 方式的跨域,这其实是采用 jsonp 的方式来完成的. 真实案例: 复制代码代码如下:var qsData = searchWord:$(#s

3、earchWord).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 方式

4、此方法不被触发.原因可能是 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) $.u

5、nblockUI( fadeOut: 10 ); , error: function(xhr) /jsonp 方式此方法不被触发.原因可能是 dataType 如果指定为 jsonp 的话,就已经不是 ajax 事件了 /请求出错处理 alert(请求出错 (请检查相关度网络状况.); ); 注意:$.getJSON( http:/跨域的 dns/document!searchJSONResult.action?name1=+value1+&jsoncallback=?, function(json) if(json.属性名=值) / 执行代码 ); 这种方式其实是上例$.ajax(.) ap

6、i 的一种高级封装, 有些$.ajax api 底层的参数就被封装而不可见了. 这样,jquery 就会拼装成如下的 url get 请求 http:/跨域的 dns/document!searchJSONResult.action?&jsoncallback=jsonp1236827957501&_=1236828192549&searchWord=%E7%94%A8%E4%BE%8BtUserId=5351&conditionBean.pageSize=15 在响应端(http:/跨域的 dns/document!searchJSONResult.action), 通过 jsoncallb

7、ack = request.getParameter(jsoncallback) 得到 jquery 端随后要回调的 js function name:jsonp1236827957501 然后 response 的内容为一个 Script Tags:jsonp1236827957501(+按请求参数生成的 json 数组+); jquery 就会通过回调方法动态加载调用这个 js tag:jsonp1236827957501(json 数组); 这样就达到了跨域数据交换的目的. jsonp 的最基本的原理是: 动态添加一个标签,而 script 标签的 src 属性是没有跨域的限制的。这样说

8、来,这种跨域方式其实与 ajax XmlHttpRequest 协议无关了. 这样其实jQuery AJAX 跨域问题就成了个伪命题了,jquery $.ajax 方法名有误导人之嫌. 如果设为 dataType: jsonp, 这个$.ajax 方法就和 ajax XmlHttpRequest 没什么关系了,取而代之的则是 JSONP 协议. JSONP 是一个非官方的协议,它允许在服务器端集成 Script tags 返回至客户端,通过 javascript callback 的形式实现跨域访问 JSONP 即 JSON with Padding。由于同源策略的限制,XmlHttpRequ

9、est 只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求, 我们可以通过使用 html 的 script 标记来进行跨域请求,并在响应中返回要执行的 script 代码,其中可以直接使用 JSON 传递 javascript 对象。 这种跨域的通讯方式称为 JSONP。 jsonCallback 函数 jsonp1236827957501(.): 是浏览器客户端注册的,获取跨域服务器上的 json 数据后,回调的函数 Jsonp 原理: 首先在客户端注册一个 callback (如:jsoncallback), 然后把 callback 的名字(如:jsonp1236827957

10、501)传给服务器。 此时,服务器先生成 json 数据。 然后以 javascript 语法的方式,生成一个 function , function 名字就是传递上来的参数 jsoncallback的值 jsonp1236827957501 . 最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。客户端浏览器,解析 script 标签,并执行返回的 javascript 文档,此时 javascript 文档数据,作为参数, 传入到了客户端预先定义好的 callback 函数(如上例中 jquery $.ajax()方法封装

11、的的 success: function (json)里.(动态执行回调函数) 可以说 jsonp 的方式原理上和是一致的(qq 空间就是大量采用这种方式来实现跨域数据交换的) .JSONP 是一种脚本注入(Script Injection)行为,所以也有一定的安全隐患. 注意,jquey 是不支持 post 方式跨域的. 为什么呢? 虽然采用 post +动态生成 iframe 是可以达到 post 跨域的目的 (有位 js 牛人就是这样把 jquery1.2.5 打 patch 的),但这样做是一个比较极端的方式,不建议采用. 也可以说 get 方式的跨域是合法的,post 方式从安全角度上,被认为是不合法的, 万不得已还是不要剑走偏锋. client 端跨域访问的需求看来也引起 w3c 的注意了,看资料说 html5 WebSocket 标准支持跨域的数据交换,应该也是一个将来可选的跨域数据交换的解决方案 .

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号