postMessage方法内嵌页面跨域传参

业务背景:
由于客户工作需要,提出需求,要在其他业务系统内内嵌本系统页面,让业务系统的系统用户成为本系统客户,并以客户身份处理业务。
方案:
父页面(业务系统页面)
子页面(本系统页面)
业务系统新建页面A,A里面有个 iframe ,将本系统页面B嵌入iframe,传递参数加签,后台验签。
A:

<iframe style="border:0px;width:100%;height:100%;display: block; border: 1px dashed #ccc; height: 800px;" src="http:xx.xx.xx/xxx.html" id="child"></iframe>
<script>
window.onload=function () {
		window.frames[0].postMessage(JSON.stringify(obj), 'http:xx.xx.xx/'); 
        window.addEventListener('message', function(messageEvent) {
            var data = messageEvent.data;
            console.info('message from child:', data);
        }, false);
};
</script>

B:

<body onload="touch_audio();"></body>
<script>
    function touch_audio(){
        window.addEventListener('message', function(ev) {
            var data = ev.data;
             console.log(data)
                }
            }
        }, false);
    }
</script>

子页面中window.addEventListener()中 ev参数可以拿请求的父页面的ip地址,后台根据ip地址做个密钥管理,前台获取到数据后,将数据和ip地址传到后台,后台根据ip地址查找密钥,用密钥解密后,将业务系统的编号与请求地址对应的业务系统编号做对比,以确定是否为已对接平台的客户。

遇到过的问题:
获取到的数据乱码——业务平台页面编码改成 utf-8。
校验事件传参为空(加载顺序原因)——给body标签加上加载方法,强制优先加载 window.addEventListener。
后期需求要求自定义iframe内嵌页面路径,经过尝试发现,改变iframe默认路径后,addListener会报错(“iframe访问路径与默认访问路径不一致”),当iframe的路径为 # 或 空 时,浏览器会默认为当前域名,后面用js动态修改路径后,会出现问题,目前还没有找到解决方式。


版权声明:本文为qq_38734891原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。