在工作中遇到了这么一个问题?根据一个url路径来获取用户的状态,实际上是发送了一个servlet请求给服务器,然后server端通过数据流打印到前端。因此使用iframe能够显示前端的状态(图片或者是文字),现在的问题是开发人员想获取到我们写的用户状态,即在iframe中显示的文字,由于之前的URL已经指定了服务器的IP地址,因此在开发人员的应用中是无法访问这个iframe的,因为IP地址不一致,已经跨域了,所以不能访问。
我的解决办法 —— 利用apache的代理方式来访问?
1、在本机中安装apache,然后配置代理
ProxyPass /http-plugins/ http://172.16.14.81:9090/plugins/
备注:标示在apache访问/http-bind/类似于访问 http://172.16.14.81:7070/http-bind/目录下的内容
2、在apache容器下添加一个页面,里面包含一个iframe标签,将src以相对路径的方式访问,apache实际上是会访问其他IP地址的路径
<iframe id="test_iframe" name="test_iframe" src="/http-plugins/presence/status?jid=abc@jdchat&type=text" ></iframe>
或者
<iframe id="test_iframe" name="test_iframe" src="http://127.0.0.1/http-plugins/presence/status?jid=abc@jdchat&type=text" ></iframe>
备注:这两种方式的效果是一样的,都没有任何问题
apache根据url实际上访问的是下面的地址
<iframe id="test_iframe" name="test_iframe" src="http://172.16.14.81:9090/plugins/presence/status?jid=abc@jdchat&type=text"></iframe>
3、访问iframe里面的内容
function init() { //使用Jquery的方式访问 alert($("pre", document.getElementById('test_iframe').contentWindow.document).attr("innerHTML")); //使用js原始代码访问 //alert(window.frames["test_iframe"].document.getElementsByTagName('pre')[0].innerHTML); //alert(document.getElementById('test_iframe').contentWindow.document.body.innerHTML); }
备注:我开始测试是将init方法放在jquery中的document.ready方法中运行的,在IE中能够正常显示,但是在chrom中无法访问,经过反复测试,将这个方法抽出来,使用按钮事件来触发,结果显示正确。
<input type="button" value="登录" id="hb" οnclick="javascript:init();" style="font-size: 12px;"/>
结论:在IE中访问iframe中的内容实用是单线程,数据是从上往下运行,如果IFRAME中的数据没有获取到会阻塞,而chrome实际上上采用多线程的方式加载内容,页面的内容已经全部OK了,但是还是访问不到iframe里面的数据。