`
征途2010
  • 浏览: 248640 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

一、问题描述

在页面渲染时需要动态获取iframe子页面的高度,然后重新设置iframe高度,达到自适应的目的,但是由于iframe子页面中也涉及到访问其他系统的页面,这就使得页面渲染时无法获取子页面高度,这里涉及到跨域访问子页面问题。

二、什么是跨域

我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题.

跨域问题是由于javascript语言安全限制中的同源策略造成的.

简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合.

例如:

URL

说明

是否允许通信

http://www.a.com/a.js 
http://www.a.com/b.js

同一域名下

允许

http://www.a.com/lab/a.js 
http://www.a.com/script/b.js

同一域名下不同文件夹

允许

http://www.a.com:8000/a.js 
http://www.a.com/b.js

同一域名,不同端口

不允许

http://www.a.com/a.js 
https://www.a.com/b.js

同一域名,不同协议

不允许

http://www.a.com/a.js 
http://70.32.92.74/b.js

域名和域名对应ip

不允许

http://www.a.com/a.js 
http://script.a.com/b.js

主域相同,子域不同

不允许

http://www.a.com/a.js 
http://a.com/b.js

同一域名,不同二级域名(同上)

不允许(cookie这种情况下也不允许访问)

http://www.cnblogs.com/a.js 
http://www.a.com/b.js

不同域名

不允许

 

解决方案

1通过修改document.domain来跨子域

 基于iframe实现的跨域要求两个域具有aa.xx.com,bb.xx.com这种特点,也就是两个页面必须属于一个基础域(例如都是xxx.com,或是xxx.com.cn),使用同一协议(例如都是 http)和同一端口(例如都是80),这样在两个页面中同时添加document.domain,就可以实现父页面调用子页面的函数。网上有很多例子,很容易找到,不过该解决方案存在一些问题:

a 安全性,当一个站点(b.a.com)被攻击后,另一个站点(c.a.com)会引起安全漏洞

b如果一个页面中引入多个iframe,要想能够操作所有iframe,必须都得设置相同domain。这样会导致很多动态创建iframe的插件无法使用,比如说富文本编辑插件。

2、基于script标签实现跨域

 script标签本身就可以访问其它域的资源,不受浏览器同源策略的限制,可以通过在页面动态创建script标签,代码如下: 

var script = document.createElement('script');  

script.src = "http://aa.xx.com/js/*.js";  

document.body.appendChild(script);  

这样通过动态创建script标签就可以加载其它域的js文件,然后通过本页面就可以调用加载后js文件的函数,这样做的缺陷就是不能加载其它域的文档,只能是js文件,jsonp便是通过这种方式实现的,jsonp通过向其它域传入一个callback参数,通过其他域的后台将callback参数值和json串包装成javascript函数返回,因为是通过script标签发出的请求,浏览器会将返回来的字符串按照javascript进行解析执行,实现了域与域之间的数据传输。 jquery中对jsonp的支持也是基于此方案。 

3、通过iframe嵌套来实现跨域

前提,www.a.coma.htmla.htmliframe调用了www.b.com下的b.htmlb.htmliframe调用了www.a.com下的c.html 
  b.html是不无法直接访问a.html的对象,因为涉及到跨域,但可以访问parent,同样c.htmlparent可以访问b.htmlc.htmla.html同域,是可以访问a下的对象的。parent.parent.js对象



<!--[endif]-->

本质上就是利用parent.parent实现对父父页面中js的回调

4、使用apache反向代理实现跨域

由于前端解决跨域问题的局限性比较大,对于 Ajax 跨域或是 iframe 跨域,建议用服务器端解决方案。

此方案的原理是接受客户端发来的请求后,经由本域服务器代理向目标服务器发送请求,并将响应数据返回给客户端。

反向代理(Reverse Proxy),顾名思义,就是代理的反向功能。我们使用代理,可以访问一些我们所不能直接访问到的网络,或者可以隐藏自己的真实身份。而反向代理,可以在不暴露内部服务器的情况下,让外部用户访问我们内部、防火墙后的服务。

使用反向代理主要有以下好处:

u  请求的统一控制,包括设置权限、过滤规则等;

u  隐藏内部服务真实地址,暴露在外的只是反向代理服务器地址;

u   实现负载均衡,内部可以采用多台服务器来组成服务器集群,外部还是可以采用一个地址访问;

u  解决Ajax跨域问题。

u  作为真实服务器的缓冲,解决瞬间负载量大的问题。

 

总结这里列举的四种方案各有优缺点: 

第一种方案:开发比较简单,但是安全性和兼容性比较差。

第二种方案:使用与单向跨域,工作量稍大。

第三种方案:能比较好的解决双向调用,但是工作量稍大。

 

第四种方案:可以适用用于几乎所有的跨域访问,而且只需要要一个域中进行开发,另一个域可以提供任何类型格式的数据。缺点是这种方案经过了中间代理,所以延迟可能稍微大一点。

  • 大小: 72.1 KB
分享到:
评论

相关推荐

    js 跨域解决方案

    本文将深入探讨JavaScript跨域问题及其解决方案,以帮助开发者理解和应对这一问题。 首先,了解同源策略是解决问题的关键。同源策略是浏览器为了保障用户数据安全而实施的一种机制,它禁止了一个源的文档或脚本获取...

    js跨域解决方案.docx

    ### js跨域解决方案 #### 一、问题描述与背景 在网页开发中,经常会遇到需要一个主页面通过`iframe`动态加载子页面的情况,并且希望根据子页面的内容自动调整`iframe`的高度,以达到视觉上的无缝对接。然而,当...

    JQuery跨域访问解决方案

    JQuery的跨域解决方案主要依赖于JSONP(JSON with Padding)技术。JSONP是一种绕过同源策略的方式,它利用HTML中的`&lt;script&gt;`标签没有同源策略限制的特点。当jQuery使用`dataType: 'jsonp'`时,它实际上是在做以下几...

    解决JS跨域访问IFrame的解决方案

    面对这样的问题,我们可以采用以下几种跨域解决方案: 1. **CORS(Cross-Origin Resource Sharing)**:服务器可以通过设置响应头`Access-Control-Allow-Origin`来允许特定的源进行跨域请求。例如,服务器端可以在...

    Javascript跨域访问解决方案

    JSONP是一种较早的跨域解决方案,它利用了浏览器允许`&lt;script&gt;`标签跨域加载资源的特性。通过动态创建`&lt;script&gt;`标签,并指定其`src`属性为一个返回JSON数据的函数调用,服务器将数据包裹在函数调用中返回,客户端...

    Javascript跨域和Ajax跨域解决方案

    JavaScript跨域和Ajax跨域是Web开发中常见的问题,尤其在进行前后端分离或API调用时,由于浏览器的同源策略限制,不同域名、协议或端口的资源请求会被阻止,这就是所谓的“跨域”。本文将深入探讨JavaScript和Ajax...

    arcgis api for javascript跨域处理方案

    除了资源代理,还可以使用其他跨域解决方案: - CORS(跨源资源共享):服务器端可以设置CORS头(如`Access-Control-Allow-Origin`),允许特定的源进行跨域请求。这种方法需要服务器端的支持,可能不适用于所有...

    js跨域问题解决方案.

    选择哪种跨域解决方案取决于应用场景和需求。JSONP适用于简单的GET请求,CORS是现代浏览器推荐的通用方案,代理服务器适用于复杂的后端集成,`document.domain`适用于同一顶级域名下的跨子域,`postMessage`适合页面...

    Spring 跨域解决方案官方 demo

    在现代Web开发中,跨域资源共享(CORS)是一个重要的概念,它允许...总之,Spring提供的CORS解决方案让开发者能够轻松处理跨域请求,同时保持应用的安全性。理解并熟练运用这些知识,对于构建现代化的Web应用至关重要。

    跨域访问解决方案,关于跨域访问cookie的资料

    ### 跨域访问解决方案与Cookie处理 在现代Web开发中,跨域问题一直是困扰开发者的一大难题。当浏览器出于安全考虑阻止不同源之间的数据交互时,跨域问题便产生了。为了解决这一问题,并确保在跨域场景下可以正确地...

    xmlhttp跨域解决方案

    为了解决这一问题,我们可以采用多种跨域解决方案,其中一种是通过设置代理服务器。 **一、什么是同源策略** 同源策略是浏览器为了保护用户安全而实施的一种安全策略,它规定浏览器只允许加载来自相同协议、域名和...

    JS跨域解决方案之使用CORS实现跨域

    正常使用AJAX会需要正常考虑跨域问题,所以伟大的程序员们又折腾出了一系列跨域问题的解决方案,如JSONP、flash、ifame、xhr2等等。本文给大家介绍JS跨域解决方案之使用CORS实现跨域,感兴趣的朋友参考下吧

    跨域请求解决方案源代码(JSONP,CORS)

    这个文件可能包含了创建XMLHttpRequest对象、设置请求头、处理响应等内容的JavaScript代码,用于演示如何在实际项目中应用这些跨域解决方案。开发者可以通过查看和运行这些代码来加深对JSONP和CORS的理解,并在自己...

    MVC中跨域解决方案

    4. JSONP(JSON with Padding):这是一种早期的跨域解决方案,适用于只支持GET请求的API。它通过动态创建`&lt;script&gt;`标签来实现跨域请求。然而,JSONP不提供安全性,只适用于简单请求,且不支持HTTP的其他方法和头。...

    前端跨域解决方案

    前端跨域解决方案,jsonp和cros两种解决方式。我们发现,Web页面上调用js文件时不受是否跨域的影响,凡是拥有"src"这个属性的标签都拥有跨域的能力,比如[removed]、、&lt;iframe&gt;。那就是说如果要跨域访问数据,...

    Ajax跨域访问解决方案

    JSONP是一种早期的跨域解决方案,它是通过动态创建`&lt;script&gt;`标签来加载数据的。因为`&lt;script&gt;`标签不受同源策略限制,可以通过`src`属性指向提供JSON数据的外部服务。服务端返回的数据是一个JavaScript函数调用,...

    arcgis js跨域解决策略

    在ArcGIS JavaScript API中,Esri提供了一个名为"Resource Proxy"的解决方案,即resource-proxy-master文件包所包含的内容。 Resource Proxy是一个轻量级的代理服务,它可以部署在你的.NET或Java服务器上。以下是...

    JS跨域访问解决方案总结

    JavaScript跨域访问解决方案 在Web开发中,由于浏览器的安全策略——同源策略(Same Origin Policy),不同源的脚本之间无法直接通信或访问彼此的资源。同源策略规定,只有当两个URL的协议、域名和端口都相同时,...

Global site tag (gtag.js) - Google Analytics