js跨域调用iframe子页面的函数 提示"没有权限"_技术之家的博客-程序员秘密

技术标签: JavaScript  

解决方法:js所在页面的网站必须和iframe子页面所在网站在同一台服务器上面。详细说明:

当某个互联网运营商的网站上规模之后,他们都会考虑将网站部署到主域名相同,子域名不同的服务器集群上,以此来构建一个聚合的应用。 

同时,希望能够利用 JavaScript,在不同子域的网页间相互操作,实现一个对用户来说“无缝”的应用。这时,跨域操作的技术难点,仿佛一下子从服务器后台,转移到了浏览器前台。因为,浏览器将承载跨子域访问的任务。为什么会这么说呢?因为,我们已经步入了集成化的 RIA 时代。 

一般情况下,通过运用 DOM 对象模型,不同窗口和框架里的内容可以通过JavaScript 互相作用。 

但是,由于浏览器可以同时在窗口或框架中显示不同的页面,甚至是不同域下的页面。为了保证数据的完整性和信息的安全性,就必须建立起一种强制规则,来保证跨域的数据不会被非法的获取和修改。 

多数情况下,只有相同域下的页面才能相互作用。比如,一个位于www.microsoft.com域下的页面,可以自由地通过 JavaScript 读写www.microsoft.com域下的其它页面,但却不能读写 home.microsoft.com 域下的页面,或是www.google.com域下的页面。完全的跨域访问(比如,www.microsoft.com域下的页面访问www.google.com域下的页面),在 JavaScript 开发中是被完全禁止的,没有任何商量的余地。但是,DOM 为 document 对象提供了一个 domain 属性,可以授权“同主域但不同子域”页面间的数据访问,这正好可以应付那些“集团军”式的前台部署。 

跨子域设置的规则:当两个二级域名,URL 协议,端口都相同的网页,自身都通过 JavaScript 显示地设置了相同的 document.domain 值,并且此值至少等于自身的二级域名,它们之间才可以相互作用。(注意,此规则只适用大于二级域名的页面,并且千万别指望 http 页面可以与 https 页面相互作用。) 

也就是说,当网页作者指定 document.domain 属性为域名的后半部分时,读写许可将扩展至二级域名。例如:http://www.microsoft.com下的某个页面,将 document.domain 属性设置成 microsoft.com,同时http://home.microsoft.com下的某个页面,也将 document.domain 属性设置成 microsoft.com,它们之间即可完成跨子域的访问。因为,只有以 microsoft.com 结尾的站点上的文档,才可能将其 document.domain 属性设置为 microsoft.com,这样就确保了同一个服务提供者的页面,才能互相提供权限,从而完成交互操作。 

注意,document.domain 属性值不能比二级域名更短(比如“com”,浏览器将禁止这种设置,并认为此操作是无效的)。但是,对于如www.microsoft.co.jp这样的域名,实际的最大操作权限应该是二级域名 microsoft.co.jp(而不是一级域名“co.jp”,浏览器不会像限制“com”那样,将“co.jp”认为是无效的。但如果你真这样做了,带来的风险可想而知)。 

在窗口、对话框、框架(frameset,frame,iframe),甚至是 IE 的 popup 窗口之间(通过 IE 特有的 window.createPopup 方法创建),只要它们涉及到了相互读写,都要考虑 document.domain 问题。这仿佛是“一损俱损,一荣俱荣”的事情,一旦你在某个地方设置了 document.domain,你必须小心应对。因为,你不知道在哪个角落里,会出现“没有权限”的脚本错误。 

让窗口或框架在不同域页面之间跳转,是件很寻常的事情,所以跳转操作总是被允许的。只有试图读写(注意此处是读和写)页面内容时,才会受到 domain 限制。例如:window.location 可以用来设置地址间的跳转,但是不能用它来读取在不同域下的地址。因为,这会使一个页面知道浏览者去过哪些地方,而这会暴露浏览者的隐私。 

在不同域间的页面制约包括 

引用
window.location 可以设置,但不能读取。其它的 location 属性和方法被禁止访问; 
document.href 可以设置,但不能读取。其它的 document 属性和方法被禁止访问; 
<iframe> 的 src 可以设置,但不能读取; 

浏览器为什么要加入跨域限制? 
浏览器的跨域网页限制,是出于安全角度考虑的,为什么会这么说呢?请想像一下,如果没有域之间的安全限制,一个无赖网页可以“偷窥”别人浏览的页面,然后通过 Ajax 方式,将“偷窥”后的数据发送到某台不为人知的服务器上,它便实现了无耻的侵略行为。 
再或者,这个无赖网页可以通过 DHTML 来更改别人页面的内容。比如:编写一个监视脚本,把用户已经打开的所有页面改换背景色,版权文字,以及放入一些自制的 banner,这样就可以把别人的整个站点变成“自己的”了。 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011116642/article/details/38637607

智能推荐

Java 装箱与拆箱机制_fastjson_的博客-程序员秘密

java有8种基本类型,在Java中,一切都以对象作为基础,但是基本类型并不是对象,如果想以对象的方式使用这8中基本类型,可以将它们转换为对应的包装类型。基本类型和包装类型的对int(4字节) Integer byte(1字节) Byte short(2字节) Short long(8字节) Long float(4字节) Float double(8字节) Double char(2字节) Character ...

Unity3d导出Xcode各种问题总结_crazygougou的博客-程序员秘密

最近两天,在尝试导出Unity项目到Xcode,遇到了很多问题,这里把尝试解决的方式发出来,如果有不对的,欢迎大家指正。这篇博客首发在游戏蛮牛,原谅我懒得重新上图来。导出ios遇见的各种问题1.could not find developer disk image这个问题是Xcode不支持某个ios版本,查看你要调试的真机或者模拟器ios的版本,再到/Appli

第6章习题 x86汇编从实模式到保护模式_普通网友的博客-程序员秘密

第6章习题1,2 ;第6章习题1,2 ;文件名:c06_1.asm ;文件说明:硬盘主引导扇区代码 ;创建日期:2017-10-04 16:57 jmp near startdata1: db 0x05,0xff,0x80,0xf0,0x97,0x30data2: dw 0x90,0xfff0,0xa0,

pycharm dubug调试问题:pydev debugger: process xxxxxx is connecting_木瓜呆的博客-程序员秘密

问题描述:程序可以正常运行,但debug调试时,报错pydev debugger: process xxxxxx is connecting中间“xxxx”数字不用管原因分析:报错原因提示为,连接错误,猜测与网络连接有关。查询资料解决方法如下:1.删除代码程序文件中的“.idea”文件(尝试,对我无效)2.防火墙:将pycharm添加到“允许应用通过Windows防火墙进行通信”(有效...

CAS(三)基于SpringMVC搭建CAS-client,SpringMVC搭建CAS客户端_oumuv的博客-程序员秘密

环境要求JDK 8+ CAS 5.2 tomcat 8+步骤一、搭建CAS服务器  --&amp;gt; CAS(一)搭建CAS - server服务器 二、配置hosts,加入如下配置127.0.0.1 cas.server.com127.0.0.1 cas.client1.com三、搭建SpringMVC项目项目名为cas-clientA,项目...

Spring-AOP 通过配置文件实现 异常抛出增强_小小工匠的博客-程序员秘密

概述实例概述异常抛出增强表示在目标方法抛出异常后实施增强,最适合的场景是事务管理,比如当参与事事务的方法抛出异常后需要回滚事务。 异常抛出增强类需要实现ThrowsAdvice接口,ThrowsAdvice接口并没有定义任何的方法,它只是一个标志接口。 在运行期,Spring采用反射的机制来进行判断。我们必须采用以下的形式来定义异常抛出的方法 public void afterThrowing(M

随便推点

学习计划_weixin_33842304的博客-程序员秘密

自己也算是一个老程序员了,但是毕业后一直没有系统的学习编程,自己感觉现在的技术乱七八糟、支离破碎的,因此决定从现在开始有计划地学习一些实用的技术:1、客户端:javascript、html、css、dhtml等;2、服务器端:.net技术3、数据库:sql server4、图像处理:photoshop5、系统管理:windows 2000系统管理转载于:https://www.cnblogs.c...

RabbitMQ——延迟队列的概念理解及应用举例_延迟队列的案例_宋子浩的博客-程序员秘密

1.延迟队列——概念理解延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。延迟队列的使用场景:订单在十分钟之内未支付则自动取消。 新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。 用户注册成功后,如果三天内没有登陆则进行短信提醒。 用户发起退款,如果三天内没有得到处理则通知相关运营人员。 预定会议后,需要在预定的时间点前十分钟通知各个与

nginx 配置文件_baotong1857的博客-程序员秘密

nginx.conf#user nobody;worker_processes auto ;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { worker_...

Android执行删除system/bin/xxx目录下文件命令_android system 命令_新潮技术研究社的博客-程序员秘密

Android里面执行命令的方式很多,Runtime.getRuntime().exec(String command);Runtime.getRuntime().exec(String [] cmdArray);Runtime.getRuntime().exec(String command, String [] envp);Runtime.getRuntime().exec(String [] cmdArray, String [] envp);Runtime.getRuntime(

idea中的插件svn设置忽略文件_ideal svn忽略文件_EastChilde的博客-程序员秘密

首先点开下方提示窗口Version Control,找到视图设置的按钮:然后选择Configure Ignored Files...点击右上角加号选择需要忽略的文件选中,最后刷新svn即可...

推荐文章

热门文章

相关标签