JS另类跨域调用,突破浏览器限制的妙招!

JS另类跨域调用,突破浏览器限制的妙招!

在做公司项目,攻关问题一个接一个,最近又碰到了一个麻烦问题,尝试了几种方法都没有解决!

这就是传说中的JS跨域调用问题

问题背景

我们做的是OA办公系统,周边还有一些外围产品,包括CMS、即时消息工具等等!现在要解决的问题就是要将新改版的CMS无缝接入OA办公系统,实现一站式办公,网站信息发布人员根本不需要进入CMS后台,直接在OA内实现办公、发布网站信息等一系列工作。(OA、CMS不在同一服务器)

设计方案

为减少以工作量,决定在OA中嵌入网站发布信息页面(也就是CMS的页面),点击CMS发布信息页面后需回调OA系统,关闭发布页面的标签页(我们自己实现的类似IE7的Tab标签)。so,OA工作量很小!设计方案可能不完美,这种东西仁者见仁智者见智,还请高手指点!

问题描述

由于两系统为内部网络使用,并且分别部署在两台服务器,所以只能用IP访问,而非域名!所以使用document.domain的方法直接被否掉(这是我第一个想到的解决方法),经过一番资料查阅,直接调用可能基本为零!

解决方法(关键来了~~)

直接调用行不通,就让我想到了另外的一种方式,调用不行,使系统触发事件进行调用。由于页面结构为OA中页面里含有IFRAME,IFRAME内为CMS页面,使我想到iframe的onload事件,当CMS页面处理完毕后,加载另外的页面,来触发onload。高手们可能发现了,这种方式会引发任何页面加载都会引发onload的调用,onload内怎么知道何时该关闭tab标签页。问题是一步步解决的,先别着急!

中间过程比较漫长,尝试使用onload、onpropertychange等事件均以失败告终,但是在我脑海里onload还是最有希望的,于是想到在处理接触页面后添加参数如:../result.html?ok,靠最后的ok来做为关闭的标记,尝试使用下列方法打开页面

window.location.href="result.html?ok";

window.open("result.html?ok","_self");

结果我再一次被成功拒绝,我忽略了window.frames["..."].location.search实际上也是一种跨域行为,iframe的src属性也不会随着里面页面的变化而变化,所以我失败了!

但是我没有放弃,继续尝试,继续思考!

现在的问题已经很简单了,只要我能获取到location.search即可,不必管其他的环境,但是现在被跨域卡住了。

突然间灵光一现,我想到了解决办法,就是将result.html页面放到OA服务器上,由于result.html页面无任何内容,所以放到何处都无所谓,只要能够获取到result.html页面后的参数即可。信息发布页面使用window.open方法或window.location.href等其他方法,跳转到其他域是没有任何问题的,所以问题解决了~~

总结

这个时候onload事件可以放到result.html页面,也可以放到iframe标签上,已经不跨域了,随便怎么调用都没有问题,都不会有拒绝访问。

另此方法需要两边配合,并且此方法只是一种参数传递、操作回调的调用,没有任何安全隐患,所以安全问题我们可以放心!

此文只介绍方法和思路,具体跨域解决方案大家可以根据各自的情况结合使用,这里就不给出具体操作代码了!

本文版权归作者所有,欢迎转摘,转摘请注明作者和出处,谢谢!
作者:振中
首发:http://hi.baidu.com/zonk518

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值