`

在 AIR 中突破同源策略访问 iframe 中的内容

阅读更多

在 AIR 中突破同源策略访问 iframe 中的内容

本篇所讲关于 AIR 的内容是基本 HTML+JS,而不是 Flex 或其他。

在 AIR  中,如果当前页面有一个 iframe,并且我们需要获取这个 iframe 的内容,但是如果 iframe 里包含的是远程页面,在默认情况下,浏览器策略并不允许这种情况,这就是同源策略的限制。

在 Titanium  这个类似于 AIR 的平台中,默认情况下是可以直接从应用的页面中去读取 iframe 中的内容而没有任何限制,但是在 AIR 中不可以。在网上搜索了一番,再看了好几遍 AIR 的文档之后,终于找到解决问题的方法了。

在 AIR 中,iframe 标签拥有额外的几个属性 :sandboxRoot、documentRoot、allowCrossDomainXHR 及 ondominitialize。这里为了解决读取 iframe 内容所用到的属性就是 sandboxRoot 及 documentRoot。

通 过 sandboxRoot 及 documentRoot,可以将本地的页面映射为远程页面,并在沙盒中运行,另外,在沙盒中运行的页面就会拥有映射域 名的域。例如,我们可以将本地的 proxy.html 映射为 http://example.com/local/proxy.html,这样,在实 际运行时,proxy.html 中如果用 document.domain 获取页面所在的域,就会得到 example.com,这个时候如果 在 proxy.html 中添加一个 iframe,这个 iframe 指向我们实际需要获取内容的地址,因为域相同,就可以直接获 取 iframe 的内容了。

例如,我们要在 AIR 中获取 http://example.com/member /login.html 的内容,或者操作这个页面的元素,就可以先用一个 proxy.html,用来实现将本地文件运行在沙盒中,再用一 个 login.html 来对实际网页进行操作。

  • <!-- proxy.html -->
  • <iframe src="http://example.com/local/login.html" id="frame" width="100%"
  •     sandboxRoot="http://example.com/local/"
  •     documentRoot="app:/" name="frame" height="100%"></iframe>
  • <!-- login.html -->
  • <iframe id='f' frameborder="0" scrolling="no"
  •     src="http://example.com/member/login.html" 
  •     width="100%" height="100%"></iframe>
  • <script type="text/javascript">
  • alert(document.domain);
  • var f = document.getElementById('f');
  • f.onload = function() {
  •     alert(f.contentWindow.document.documentElement.innerHTML);
  • };
  • </script>

在 proxy.html 中, 虽然 iframe 的 src 属性是 http://example.com/locale/login.html,但是由于这个 iframe 具 有 sandboxRoot 属性,所以实际请求会被重定向到相对于 sandboxRoot,并且使用 documentRoot 进行定位的实际地 址 app://login.html,但是这个时候 login.html 中具 有  document.domain="example.com" 这个属性,所有可以直接使用 iframe.contentWindow 来访 问 iframe 中的内容。

虽然解决方法有些麻烦,但终归可以实现突破同源策略的限制来读取 iframe 的内容了。

当然,如果你有更好的方法,请不吝赐教:)

分享到:
评论

相关推荐

    AIR 版 843端口策略文件服务器

    在IT行业中,AIR(Apache Flex Integrated Runtime)是一款跨平台的应用程序运行时环境,它允许开发者使用ActionScript和Flex框架创建桌面及移动设备上的富互联网应用程序(RIA)。标题中的"AIR 版 843端口策略文件...

    AIR程序窗口 基于内容 动态缩放窗口

    标题中的“AIR程序窗口 基于内容 动态缩放窗口”指的是使用Adobe AIR技术开发的桌面应用程序,它的窗口能够根据内容自动调整大小,并且在缩放过程中保持良好的视觉效果,比如实现圆角设计。这涉及到软件界面设计中的...

    flash air中文帮助文档

    的许可,意味着开发者可以在Adobe AIR应用中实现高质量的语音通信功能。 - **视频压缩和解压缩**:采用了On2 TrueMotion视频技术,这表明Adobe AIR能够支持高质量的视频播放和流媒体功能。 - **OpenSymphony Group...

    fckEditor air内容编辑器的使用以及在air中使用

    **fckEditor air内容编辑器的使用以及在Adobe AIR中集成** fckEditor是一个开源的、基于JavaScript的富文本编辑器,它允许用户在网页上创建和编辑内容,类似于Word的功能,但适用于Web环境。本篇文章将深入探讨如何...

    Adobe AIR 1.5 中文帮助手册

    1.5版本是Adobe AIR的一个重要里程碑,它为开发者提供了更多的功能和改进,使得Web应用可以更流畅地运行在用户的桌面环境中。 1. **Adobe AIR概述** Adobe AIR为开发人员提供了一个集成的开发环境,可以利用Web...

    flex4.6 air 读写文本文件

    在Flex 4.6与Adobe Integrated Runtime (AIR)的开发中,读写文本文件是一项基本操作,对于初学者来说尤其重要。本教程将详细介绍如何在Flex应用中实现这一功能,以便用户可以对本地的文本文件进行读取、修改以及保存...

    flex air中文官方帮助文档

    Flex Air是中国Adobe公司开发的一款基于Flash技术的富互联网应用程序(RIA)开发平台,它...这份文档详尽地解答了在Flex Air开发过程中可能遇到的各种问题,对于提升开发效率和创建高质量的桌面应用程序具有重要价值。

    AIR 的本地数据库访问

    在Adobe AIR(Adobe Integrated Runtime)开发中,本地数据库访问是一个重要的功能,允许应用程序存储和管理数据,而无需依赖远程服务器。AIR支持SQLite数据库,这是一个轻量级、无服务器、自包含的数据库系统,适合...

    air中文官方帮助

    - 在开发工具中选择新建Adobe AIR项目。 - 选择支持的平台,此处为Android。 - 设置项目的名称、位置和其他配置选项。 #### 3.3 设计用户界面 - 使用HTML/CSS/JavaScript或Flash/Flex来设计UI。 - 考虑到不同设备...

    在windows下激活Airprint无线打印 AirPrint+Activator

    AirPrint无线打印技术当前仅面向Mac开放,并且只能在几款惠普打印机上实现。没有这些AirPrint兼容打印机的可以借助一款名为Printopia的Mac程序激活AirPrint功能,那么Windows用户呢?想在PC上启用AirPrint的Windows...

    as3 adobe air ios airplay

    通过在AS3项目中集成Adobe AIR,开发者可以扩展他们的应用程序,使其支持将媒体内容或应用界面镜像到支持AirPlay的设备上。这为用户带来了更丰富的互动体验,例如在大屏幕上观看视频或玩游戏。 【知识点】 1. **...

    Flex IFrame

    这通常涉及事件监听和处理,比如在IFrame中触发的事件可以被Flex应用捕获,反之亦然。 4. 考虑安全性和性能:由于IFrame加载的内容可能来自不同的域,需要注意跨域安全问题。此外,加载大量或复杂的网页内容可能会...

    air_1.5中文帮助

    在AIR环境中,Flash可以用来创建具有桌面级功能的富媒体应用程序,比如全屏模式、本地文件系统访问等。 4. **HTML+JavaScript**:HTML(超文本标记语言)和JavaScript是Web开发的基础,用于构建网页结构和实现交互...

    使用AIR中的File对象

    1. **桌面应用上下文**:由于AIR是针对桌面环境的应用开发平台,因此`File`对象可以访问用户的完整文件系统,包括读写权限,这在Web应用中是无法实现的。 2. **安全限制**:尽管有广泛的访问权限,但出于安全考虑,...

Global site tag (gtag.js) - Google Analytics