Java Script 跨域调用

在大型项目开发中, 我们经常碰到一些情况, 需要在自己的系统上调用其他系统得页面。 调用的方式有:Iframe, window open等等。 通常情况下, 浏览器出于安全考虑不容许Javascript 跨域访问, 试想如果可以的话那么我们可以非常方便的使用其他网站的代码, 如我们可以很方便的把Google的页面嵌到自己的iframe 中 下面我们主要讲讲使用Iframe的cross domain scripting. 方法一:设置domain 在页面上有个系统变量 document.domain能够用来察看和更改当前页面的域 更改的方式如 document.domain = “google.com” 如果想通过更改document.domain来实现Cross domain scripting有如下限制条件: 1. 主页面和子页面不许都要设置为相同的域。  2. 主页面和子页面的顶级域名必须相同, 如主页面为 a.test.com 子页面为b.test.com 如果顶级域名不同即使设置相同的域也无法跨域调用 设置domain的优缺点: 优点: 通过设置document.domain 进行跨域访问, 改动最小, 同时对双方的耦合很低 缺点: 如果双方必须使用不同的顶级域名那么通过document.domain就无法实现跨域访问 并且, 如果主页面很复杂, 页面上使用很多iframe,那么所有需要和主页面通信的iframe都需要设置document.domain。 方法二: 使用代理(proxy) page 子页面调用主页面方法: 主调用方需要额外的提供一个代理页面, 该页面只负责接收parameters,并且调用主页面中的方法。子页面中需要添加一个隐藏的Ifame, iFrame的URL指向主调用方提供的代理页面, 当子页面需要和主页面通信时,只需要添加相关参数到代理页面的URL中并且刷新隐藏的iFrame. 在代理页面中根据接收到的参数调用主页面中的方法。  看到这里细心的读者或许会发现这样的一个问题, 代理页面如何调用到主页面中的方法?他们即便部署在同一个Application中, 但是如果他们之间没有关系也是无法实现相互调用的。  那我们就来研究一下他们之间的关系。  其中代理页面是在子页面中被加载的 那么在代理页面中的parent指向子页面。 而子页面是被加载在主页面中, 那么子页面的parent指向主页面。 所以在代理页面中使用parent.parent就指向主页面, 因为他们处于同一个域下所以可以相互调用。 主页面调用子页面方法: 子页面同样需要提供一个代理页面, 同上面的道理我们是否需要在主页面提供另外一个iFrame来指向该代理页面呢?答案是否定的. 让我们来分析一下: 如果我们在主页面中添加一个隐藏的Iframe 指向代理页面, 那么该代理页面的parement指向主页面, 而proxy的目标是调用子页面中的方法, 所以必须要在主页面中尝试调用寻找子页面, 所以就会出现下面的代码 parent.childiframe,因为parent和childframe处于不同的域所以调用失败。  那么这种情况该如何处理呢? 让我们把该代理Iframe放到 子页面中 然后自主页面中使用如下代码刷新该iFrame: document.frames["childFrame"].frames["proxy"].location.href=url; 也许有人会问主页面和子页面的域不同, 如何可以刷新子页面的URL? 这也正是我的问题, 我注意到这里我们甚至无法读取该URL, 却可以更改。 我们权且当作是浏览器留得一条后门,因为它确实可以更改。 优点: 该方法不需要设置document.domain, 使用的限制大大减少。  缺点: 两边的耦合增加, 复杂度增加。 如果各位读者有其他方法可以实现javascript跨域访问, 欢迎讨论。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值