在 AIR 中突破同源策略访问 iframe 中的内容
Posted on 10-26 20:20 2009 in Web开发
by xujiwei <!-- [ 字体大小:<a href="javascript:SetFontSize('articlecontentview',12);">小</a> <a href="javascript:SetFontSize('articlecontentview',14);">中</a> <a href="javascript:SetFontSize('articlecontentview',16);">大</a> ]-->
版权声明
:未作特别说明的内容可以转载,转载时请务必以超链接形式标明文章原始出处
和作者信息及本声明。本文地址:http://xujiwei.com/blog/?id=918
本篇所讲关于 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 的内容了。
当然,如果你有更好的方法,请不吝赐教:)
分享到:
相关推荐
在IT行业中,AIR(Apache Flex Integrated Runtime)是一款跨平台的应用程序运行时环境,它允许开发者使用ActionScript和Flex框架创建桌面及移动设备上的富互联网应用程序(RIA)。标题中的"AIR 版 843端口策略文件...
标题中的“AIR程序窗口 基于内容 动态缩放窗口”指的是使用Adobe AIR技术开发的桌面应用程序,它的窗口能够根据内容自动调整大小,并且在缩放过程中保持良好的视觉效果,比如实现圆角设计。这涉及到软件界面设计中的...
的许可,意味着开发者可以在Adobe AIR应用中实现高质量的语音通信功能。 - **视频压缩和解压缩**:采用了On2 TrueMotion视频技术,这表明Adobe AIR能够支持高质量的视频播放和流媒体功能。 - **OpenSymphony Group...
**fckEditor air内容编辑器的使用以及在Adobe AIR中集成** fckEditor是一个开源的、基于JavaScript的富文本编辑器,它允许用户在网页上创建和编辑内容,类似于Word的功能,但适用于Web环境。本篇文章将深入探讨如何...
- **性能优化**:在开发过程中需要注意性能优化,例如合理使用缓存、减少不必要的数据加载和提高代码执行效率等。 - **多平台支持**:由于Adobe AIR支持多个操作系统,因此开发者需要注意确保应用程序在不同平台上都...
1.5版本是Adobe AIR的一个重要里程碑,它为开发者提供了更多的功能和改进,使得Web应用可以更流畅地运行在用户的桌面环境中。 1. **Adobe AIR概述** Adobe AIR为开发人员提供了一个集成的开发环境,可以利用Web...
在Flex 4.6与Adobe Integrated Runtime (AIR)的开发中,读写文本文件是一项基本操作,对于初学者来说尤其重要。本教程将详细介绍如何在Flex应用中实现这一功能,以便用户可以对本地的文本文件进行读取、修改以及保存...
Flex Air是中国Adobe公司开发的一款基于Flash技术的富互联网应用程序(RIA)开发平台,它...这份文档详尽地解答了在Flex Air开发过程中可能遇到的各种问题,对于提升开发效率和创建高质量的桌面应用程序具有重要价值。
在Adobe AIR(Adobe Integrated Runtime)开发中,本地数据库访问是一个重要的功能,允许应用程序存储和管理数据,而无需依赖远程服务器。AIR支持SQLite数据库,这是一个轻量级、无服务器、自包含的数据库系统,适合...
- 在开发工具中选择新建Adobe AIR项目。 - 选择支持的平台,此处为Android。 - 设置项目的名称、位置和其他配置选项。 #### 3.3 设计用户界面 - 使用HTML/CSS/JavaScript或Flash/Flex来设计UI。 - 考虑到不同设备...
AirPrint无线打印技术当前仅面向Mac开放,并且只能在几款惠普打印机上实现。没有这些AirPrint兼容打印机的可以借助一款名为Printopia的Mac程序激活AirPrint功能,那么Windows用户呢?想在PC上启用AirPrint的Windows...
通过在AS3项目中集成Adobe AIR,开发者可以扩展他们的应用程序,使其支持将媒体内容或应用界面镜像到支持AirPlay的设备上。这为用户带来了更丰富的互动体验,例如在大屏幕上观看视频或玩游戏。 【知识点】 1. **...
这通常涉及事件监听和处理,比如在IFrame中触发的事件可以被Flex应用捕获,反之亦然。 4. 考虑安全性和性能:由于IFrame加载的内容可能来自不同的域,需要注意跨域安全问题。此外,加载大量或复杂的网页内容可能会...
在AIR环境中,Flash可以用来创建具有桌面级功能的富媒体应用程序,比如全屏模式、本地文件系统访问等。 4. **HTML+JavaScript**:HTML(超文本标记语言)和JavaScript是Web开发的基础,用于构建网页结构和实现交互...
本文将深入探讨如何在Windows平台上实现AirPlay功能的服务端程序,主要围绕"xindawn-windows-airplay-master.zip"这个压缩包中的"Air Media Server"项目,以及与之相关的"airplay"、"libairplaysdk"和"xindawn"标签...