做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中, 我们希望使用Ajax来获得B网站中的特定内容, 如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。 Ajax的跨域访问问题是现有的Ajax开发人员比较常遇到的问 题。 IE对于跨域访问的处理是,d出警告框,提醒用户。 如果用户将该网站纳入可信任网站,或者调低安全级别, 那么这个问题IE就不会在提醒你。 FireFox等其它非微软的浏览器遇到跨域访问, 则解决方案统一是拒绝访问。 有人说,IE是主流浏览器,只要它能正常使用就好了。此言差已, IE虽然能够处理,但是是有前提的, 要么用户不厌其烦地在页面d出警告框之后点击是( 点击否就不执行该Ajax调用了), 要么用户将该网站纳入可信任站点。这两种做法, 在企业管理系统的应用中倒是比较常见, 因为系统管理员可以以行政手段保证用户的行为。 但是对于互联网上的网站或者门户开发,这种做法则不行。 最近遇到了这个问题, 需要在跨域访问结束之后完成使主窗口出现一些特效, 搜索了一些资料, 通过不断尝试以及在不同浏览器中进行兼容性测试, 找到了几个可行的方案: 1、Web代理的方式。 即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网 站的指定页面,由该页面代替用户页面完成交互, 从而返回合适的结果。 此方案可以解决现阶段所能够想到的多数跨域访问问题, 但要求A网站提供Web代理的支持, 因此A网站与B网站之间必须是紧密协作的,且每次交互过程, A网站的服务器负担增加,且无法代用户保存session状态。 2、on-Demand方式。MYMSN的门户就用的这种方式, 不过MYMSN中不涉及跨域访问问题。 动态控制script标记的生成, 通过修改script标记的src属性完成对跨域页面的调用。 此方案存在的缺陷是, script的src属性完成该调用时采取的方式时get方式, 如果请求时传递的字符串过大时,可能会无法正常运行。 不过此方案非常适合聚合类门户使用。 3、iframe方式。 查看过醒来在javaeye上的一篇关于跨域访问的帖子, 他提到自己已经用iframe的方式解决了跨域访问问题。 数据提交跟获取,采用iframe这种方式的确可以了, 但由于父窗口与子窗口之间不能交互(跨域访问的情况下, 这种交互被拒绝),因此无法完成对父窗口效果的影响。 4、用户本地转储方式: IE本身依附于windows平台的特性为我们提供了一种基于i frame,利用内存来“绕行”的方案, 即两个window之间可以在客户端通过windows剪贴板的 方式进行数据传输, 只需要在接受数据的一方设置Interval进行轮询, 获得结果后清除Interval即可。 FF的平台独立性决定了它不支持剪贴板这种方式, 而以往版本的FF中存在的插件漏洞又被fixed了, 所以FF无法通过内存来完成暗渡陈仓。 而由于文件 *** 作FF也没有提供支持( 无法通过Cookie跨域完成数据传递), 致使这种技巧性的方式只能在IE中使用。 5、我自己用于解决这类问题的方式:结合了前面几种方式, 在访问A网站时,先请求B网站完成数据处理, 再根据返回的标识来获得所需的结果。这种方法的缺点也很明显, B网站的负载增大了。优点,对session也实现了保持, 同时A网站与B网站页面间的交互能力增强了。最重要的一点, 这种方案满足了我的全部需要。 总结一下,以上方案中可选择的情况下,我最推荐on- Demand方式,在不需要提交大量数据的情况下, 这种方式能够解决您的大部分问题。
参考资料:
为了更好的用户体验,目前很多的网站都是用到了 Ajax 技术。其中有一部分网站需要向第三方网 站获得数据,例如向淘宝获得 json 接口数据,但目前的主流浏览器都不支持 Ajax 跨域 *** 作,如果需要 从第三方网站直接获得 json 数据就会变的很麻烦,就需要开发人员做很多复杂的甚至是难以实现的处理 。现在 Fikker 可以轻松解决这个问题,向 Fikker 转向管理中增加几个转向配置,将本来依靠网站自身 程序来解决的问题,即可由 Fikker 转向管理轻松来完成 Ajax 跨域 *** 作,大大简化开发复杂度和提高生 产效率。
由 于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决 ajax的跨域问题。本篇将讲述一个小白从遇到跨域不知道是跨域问题,到知道是跨域问题不知道如何解决,再到解决跨域问题,最后找到两种方法解决ajax 跨域问题的全过程。
不知是跨域问题
起 因是这样的,为了复用,减少重复开发,单独开发了一个用户权限管理系统,共其他系统获取认证与授权信息,暂且称之为A系统;调用A系统以B为例。在B系统 中用ajax调用A系统系统的接口(数据格式为json),当时特别困惑,在A系统中访问相应的url可正常回返json数据,但是在B系统中使用 ajax请求同样的url则一点儿反应都没有,好像什么都没有发生一样。这样反反复复改来改去好久都没能解决,于是求救同事,提醒可能是ajax跨域问 题,于是就将这个问题当做跨域问题来解决了。
知跨域而不知如何解决
知道问题的确切原因,剩下的就是找到解决问题的方法了。google了好久,再次在同事的指点下知道jQuery的ajax有jsonp这样的属性可以用来解决跨域的问题。
找到一种解决方式
现在也知道了怎样来解决跨域问题,余下的就是实现的细节了。实现的过程中错误还是避免不了的。由于不了解json和jsonp两种格式的区别,也犯了错误,google了好久才解决。
首先来看看在页面中如何使用jQuery的ajax解决跨域问题的简单版:
ajax只能获取本域名下的数据,不允许跨域请求
如果你的页面和请求地址不在一个域名下,你就只能先发ajax到本站点后台,然后由后台去curl你需要取数据的服务器,将取到的数据再返回给页面
你直接循环咯。
比如
var result=[];
for(var i=100;i<=200;i++){
var url='1921681'+i;
$post(url,{},function(data){
//这里判断返回值,有的话就push到结果数组里面去。
},'json')
}
Jquery ajax在请求不同域名(外网)的URL时,由于浏览器安全限制(同源策略)是不允许请求的,将会发生错误。如果想要在这样的场景下获取返回的数据,可以参考下面的方法:
1、搭建服务器做代理捉取跨域请求返回的数据,本地应用页面的ajax请求建立的代理服务器就能间接的实现这样的需求。但是此种做法较为复杂,不建议使用;
2、使用jsonp跨域访问,这种方法是较为普遍的解决方案,其实现原理是:HTML的<script>标签是可以突破同源策略从其他来源获取数据,所以可以通过<script>标签引入jsonp文件,然后通过一系列JS *** 作获取数据。
具体实现步骤如下:
利用本地页面js创建一个<script>元素,地址指向第三方的API网址,形如:
<script src=";提供一个回调函数来接收数据(函数名可约定,或通过地址参数传递), 第三方产生的响应为json数据的包装(故称之为jsonp,即json padding),形如:
callback({"name":"hax","gender":"Male"})这样浏览器会调用callback函数,并传递解析后json对象作为参数。本地脚本可在callback函数里处理所传入的数据。
示例代码:
<script>var url = ";
使用jsonp需要后端代码配合, 后台返回的json外面需要由回调函数包裹。
以上就是关于本来正常的ajax调用出现了跨域问题全部的内容,包括:本来正常的ajax调用出现了跨域问题、解析JSON数据格式时遇到AJAX跨域问题,怎么解决、Ajax跨域问题,请求第三方接口数据,求助等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)