最近给一个系统进行系统集成,配置了一个单点,把两个系统集成起来,以A系统为主系统,然后把B系统的菜单加到A系统中,这样就像是一个系统一样,访问起来也简单。但出了一个问题,就是iframe跨域访问的问题了。具体情况是这样:A系统部署在http://192.168.0.1上,B系统部署在http://192.168.0.2上。B系统的菜单是通过配置iframe的src来实现的。由于起初一直在firefox上测试,没有什么问题,一切正常。但通过IE8测试时发现,B系统的菜单根本就不能访问,IE9上是登陆A系统后,第一次点B系统菜单出现空白页,也就是一个大白屏,什么也没有。第二次以后就都能正常访问了。起初我以为是单点的问题,后来发现登陆A系统后,再开一个标签页访问B系统是正常的,说明单点没有问题。这才怀疑是可能是iframe的问题。
网上搜到的解决办法是:
1. 修改Client的设置
使Client可以接受来自任何网站的Cookie(具体设置在IE选项的隐私页中, 将B站点加入到受信任的站点)
或者将两个domain都设置为受信任站点
2. 应用的domain修改
简单方案: 两个应用使用同一个domain
复杂方案: 可以在iframe加载的页面里通过setdomain来强制更改
3. P3P
第一种: 在要嵌入的内容中(iframe指向的站点)输出P3P的主机头声明, 步骤如下:
> 打开IIS管理器 inetmgr
> 选择被嵌入iframe源站点或者目录,右键点击打开属性框
> 切换到HTTP头
> 添加
> 自定义HTTP头名: P3P
> 自定义HTTP头值: CP="CAO PSA OUR"
> 关闭属性框退出,即刻生效
第二种: 在被嵌入页面page_onload里添加一语句:Response.AddHeader("P3P","CP=CAO PSA OUR");
最终我自己的解决办法是:
把192.168.0.2的B系统部署到192.168.0.1上。这样就不用改代码,也不用让用户去配置IE了。如果原来两个系统都不可移动,那么只能让使用系统的所有用户都配置一下自己的IE。最简单的配置就是:打开IE浏览器->工具->Internet选项->安全->受信任的站点->把http://192.168.0.2添加上去。