与iframe进行跨域交互的解决方案(推荐)

目录
  • 前言
  • 使用 postMessage() 方法
  • 使用location.hash
  • document.domain属性
  • 使用window.name 属性
  • CORS
  • 使用JSONP
  • 使用WebSocket
  • 使用WebRTC
  • 使用中间页面

前言

在Web开发中,为了避免安全漏洞,浏览器会实行同源策略(Same-Origin Policy),即只允许同源网页之间进行交互,而跨域的交互是被禁止的。但是,有时我们需要在不同域名的页面之间进行数据传递和交互。

使用 postMessage() 方法

通过 postMessage() 方法可以在两个不同的窗口之间传递消息,包括不同域名的 iframe。在父页面中使用 postMessage() 方法发送消息,在子页面中使用 addEventListener() 方法监听消息。需要注意的是,需要在两个页面中都添加相应的代码才能实现跨域交互。

在父页面中:

// 发送消息到 iframe
var iframe = document.getElementById('my-iframe');
iframe.contentWindow.postMessage('Hello from parent', '*');

// 接收子页面发来的消息
window.addEventListener('message', function(event) {
  if (event.origin !== 'http://example.com') return; // 验证消息来源
  console.log('Received message from iframe:', event.data);
}, false);

在子页面中:

// 发送消息到父页面
window.parent.postMessage('Hello from iframe', '*');

// 接收父页面发来的消息
window.addEventListener('message', function(event) {
  if (event.origin !== 'http://example.com') return; // 验证消息来源
  console.log('Received message from parent:', event.data);
}, false);

使用location.hash

在父页面中设置一个定时器,用于检测目标页面的URL哈希值是否发生变化

setInterval(function() {
  if (document.getElementById("myIframe").contentWindow.location.hash) {
    // 子页面URL哈希值发生变化,执行相应的操作
  }
}, 100);

在子页面中设置一个定时器,用于检测父页面URL哈希值是否发生变化

setInterval(function() {
  if (window.location.hash) {
    // 父页面URL哈希值发生变化,执行相应的操作
  }
}, 100);

父页面中通过改变iframe的src属性来向目标页面发送消息

document.getElementById("myIframe").src = "http://www.example.com/target-page#" + message;

子页面中通过改变location.hash来向父页面发送消息

window.location.hash = message;

使用location.hash和iframe进行跨域交互的方式存在一些限制和安全风险,例如URL哈希值的长度限制、URL哈希值被篡改等问题,因此需要谨慎使用,确保数据的安全性和完整性

document.domain属性

子页面中设置document.domain属性,将其设置为父页面的域名,以便子页面和父页面具有相同的域名,从而实现跨域交互。

document.domain = "example.com";

父页面通过iframe元素的contentWindow属性获取子页面的window对象,从而可以访问子页面的内容和方法。

var iframe = document.getElementById("myFrame");
var childWindow = iframe.contentWindow;

子页面可以通过window.parent属性获取父页面的window对象,从而可以访问父页面的内容和方法。

var parentWindow = window.parent;

注: 设置domain属性是关键!!!

使用window.name 属性

可以利用 iframe 的 window.name 属性来进行跨域交互。由于 window.name 属性在同一窗口中是唯一的,因此可以将需要传递的数据存储在该属性中,在父页面中读取。

在父页面中:

<iframe id="myIframe" src="http://www.b.com"></iframe>
<script>
window.addEventListener('message', function(e) {
  // 处理从子页面发送过来的消息
  console.log(e.data);
});

function onLoad() {
  var iframe = document.getElementById('myIframe');
  var iframeWindow = iframe.contentWindow;
  // 获取 iframe 的 window 对象
  iframeWindow.name = 'hello from A';
  // 在 iframe 的 window 对象中设置 name 属性
}
</script>

在子页面中:

// 发送消息给父页面
window.top.postMessage(window.name, 'http://www.a.com');

在子页面中,我们设置了 window.name 的值,并使用 window.top.postMessage 方法向父页面发送消息。在父页面中,我们通过监听 window.message 事件来接收这个消息。注意,postMessage 方法中的第二个参数必须是父页面的域名,否则浏览器会拒绝发送消息。

需要注意的是,使用 window.name 属性进行跨域交互可能存在一些安全风险,因此需要谨慎使用,window.name也有2M容量的限制

CORS

CORS(Cross-Origin Resource Sharing)是一种跨域资源共享的机制,它通过在服务端设置响应头来实现跨域通信。通过在响应头中设置 Access-Control-Allow-Origin、Access-Control-Allow-Methods 等字段,可以允许指定的源、方法等跨域访问资源。在客户端中,可以像访问同域资源一样访问跨域资源。

使用JSONP

JSONP 是一种通过动态添加 <script> 标签来实现跨域通信的方法。它的原理是在服务端返回一个函数调用,这个函数的参数是需要传递的数据。在客户端中,通过动态创建 <script> 标签并指定 src 属性来调用这个函数,从而实现跨域通信。需要注意的是,使用 JSONP 时需要信任提供数据的服务端,因为它会执行服务端返回的代码。

使用WebSocket

WebSocket 是一种双向通信协议,可以在客户端和服务端之间建立一个持久化的连接。与 HTTP 不同,WebSocket 不会遵循同源策略,因此可以实现跨域通信。在客户端中,可以使用 WebSocket 对象与服务端建立连接,并通过 send() 方法发送数据。在服务端中,可以监听 WebSocket 连接,并在接收到客户端的数据时进行处理。

使用WebRTC

WebRTC可以在不同域名下的浏览器之间直接传输数据,从而实现跨域通信。

使用中间页面

参考链接:如何基于 iframe 解决跨域?

到此这篇关于与iframe进行跨域交互的解决方案的文章就介绍到这了,更多相关iframe跨域交互内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue中iframe使用以及结合postMessage实现跨域通信

    目录 使用场景 需求 iframe使用 基本使用 常用属性 iframe高度自适应 获取iframe的内容 同域下获取父级/子级内容 iframe跨域 postMessage通信 在vue中使用 使用场景 需求 在一个H5项目的页面中以url的方式嵌入另一个项目的页面.(不得不使用iframe) 而为了兼容移动端api(封装的一个移动端api,iframe内嵌页面不生效),需要实现父子页面的通信 (使用postMessage). iframe使用 基本使用 直接在页面嵌套iframe标签指定sr

  • 关于iframe跨域POST提交的方法示例

    前言 以前在面试的时候经常遇到问关于跨域的事儿,所以自己对跨域有一定的概念性了解,知道什么是跨域以及解决跨域的方法,但是具体实际从来没有操作过,直到最近在公司项目中,遇到了一个需要使iframe跨域进行POST提交的实际案例,我才明白具体如何使用iframe进行跨域操作. 说到跨域,就不得不提起浏览器的同源策略. 同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互. 源 如果协议,端口(如果指定了一个)和主机对于两个页面是相同的,那么这两个页面就具有相同的源. 从这个定义可以看

  • 基于iframe实现ajax跨域请求 获取网页中ajax数据

    大家都知道,在不同域的情况下是不能发送ajax请求的,浏览器会报如下错误: 同时,内嵌的iframe中无法进行跨域通信的,也就是说不同域的iframe是无法互相读取数据的(当然利用hash变化可以从父window传入数据到子iframe,不过并没有什么意义).iframe跨域通信时,浏览器会报如下错误: 其实这两个问题都是由于跨域造成的. 下面就介绍如何解决这个问题. 其实问题的关键就在于,浏览器在解析ajax请求地址时会和当前网页的地址进行比较,如果是跨域的,那就禁止掉并且报错.那么我们如果让

  • javascript iframe跨域详解

    1.什么引起了ajax跨域不能的问题 ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互,而浏览器出于安全考虑,不允许js代码进行跨域操作,所以会警告. 2.有什么完美的解决方案么? 没有.解决方案有不少,但是只能是根据自己的实际情况来选择. 具体情况有: 一.本域和子域的相互访问: www.aa.com和book.aa.com 二.本域和其他域的相互访问: www.aa.com和www.bb.com 用 iframe 三.本域和其他域的相互访问: www.aa.com和w

  • 详解iframe跨域的几种常用方法(小结)

    背景 随着业务的发展,自然地会有一些公共的业务被抽离成为公共组件共各个项目使用.但是由于各个项目用到的技术栈都有所不同,所以这个公共组件就不能方便地被引用了.为解决这个问题,我们把这个组件写成了单独的页面挂到一个域名下,其他项目采用iframe或者webview的方式去加载这个页面,从而实现功能的简单复用. 不过这过程中也产生了很多问题,单是跨域就会出现好几次了.以下我将会介绍我遇到的跨域问题以及一些解决方法. 为什么会跨域 为了保证用户信息的安全,95年的时候Netscape公司引进了同源策略

  • iframe与主框架跨域相互访问实现方法

    1.同域相互访问 假设A.html 与 b.html domain都是localhost (同域) A.html中iframe 嵌入 B.html,name=myframe A.html有js function fMain() B.html有js function fIframe() 需要实现 A.html 调用 B.html 的 fIframe(),B.html 调用 A.html 的 fMain() A.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD H

  • JS实现iframe中子父页面跨域通讯的方法分析

    本文实例讲述了JS实现iframe中子父页面跨域通讯的方法.分享给大家供大家参考,具体如下: 在非跨域的情况下,iframe中的子父页面可以很方便的通讯,但是在跨域的情况下,只能通过window.postMessage()方法来向其他页面发送信息,其他页面要通过window.addEventListener()监听事件来接收信息: #跨域发送信息 #window.postMessage()语法 otherWindow.postMessage(message, targetOrigin, [tra

  • Ajax跨域的完美解决方案

    公司要做一个活动页面,在其过程中发现所有的接口,ajax请求跨域.这里对跨域做个简单介绍以及提供几种解决办法. 由于浏览器实现的同源策略的限制,XmlHttpRequest只允许请求当前源(域名.协议.端口)的资源,所以AJAX是不允许跨域的.这里提供自己常用的三种方法: 1.jsonp访问 JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问: 实现方式 1) <

  • Ajax跨域问题及解决方案(jsonp,cors)

    跨域 跨域有三个条件,满足任何一个条件就是跨域 1:服务器端口不一致  2:协议不一致  3:域名不一致 解决方案: 1.jsonp 在远程服务器上设法动态的把数据装进js格式的文本代码段中,供客户端调用和进一步处理:在前台通过动态添加script标签及src属性,表面看上去与ajax极为相似,但是,这和ajax并没有任何关系:为了便于使用及交流,逐渐形成了一中非正式传输协议,人们把它称作 jsonp . 代码如下: html: <body> <form action="/&q

  • 面试突击之跨域问题的解决方案详解

    目录 1.跨域三种情况 2.跨域问题演示 2.1 前端网站 2.2 后端接口 3.解决跨域问题 3.1 通过注解跨域 3.2 通过配置文件跨域 3.3 通过 CorsFilter 跨域 3.4 通过 Response 跨域 3.5 通过 ResponseBodyAdvice 跨域 4.原理分析 演示项目源码 总结 跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题.跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据. 但这个保护机制也带来了新的问题

  • form+iframe解决跨域上传文件的方法

    (1)  jsp代码: <form id="form" name="form" enctype="multipart/form-data" method="post" target="hidden_frame"> <table style="border:0;width:100%;text-align:middle;"> <tr style="bo

  • Ajax请求WebService跨域问题的解决方案

    1.背景 用Jquery中Ajax方式在asp.net开发环境中WebService接口的调用 2.出现的问题 原因分析:浏览器同源策略的影响(即JavaScript或Cookie只能访问同域下的内容); 3.解决方案: (1) JSONP:只支持GET方式 (2) CROS:跨域资源共享 以下为CROS解决方案: a.在WebService接口加上响应头信息: b.在web.config文件中加上相关配置节信息: 运用a或者b的解决方案后,浏览器头信息中变动如下: 最终问题得以较好的解决,但对

  • JS跨域交互(jQuery+php)之jsonp使用心得

    什么是jsonp? 说到jsonp,你可能最先想到JSON:它还真和JSON有关系: JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外.利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产

  • Ajax实现跨域访问最新解决方案

    在实际项目当中,我们经常会遇到同一个域名下不同项目之间通过Ajax相互调用数据,这样问题就来了,如何通过Ajax实现跨域呢? 解决方案 1.Jsonp Jsonp解决跨域相对简单,服务器无需任何配置.具体实现如下: $.ajax({ type: 'get', url: 'http://xxx.com', data: {}, dataType: 'jsonp', success: function (data) { }, error: function (data) { mask.close();

  • Quarkus中filter过滤器跨域cors问题解决方案

    目录 前言 web依赖 过滤器filter开发 resteasy的filter vertx的filter Quarkus中的跨域 前言 Quarkus中的web模块是基于java标准web规范jax-rs构建的,实现则选用了jboss的resteasy.这部分只是请求路由转发部分实现.真正的请求接收则使用了eclipse开源的vert.x框架,底层也是基于netty的一个响应式开发框架.Quarkus将vert.x和resteasy集成在了一起,所以支持响应式和非响应式应用混合开发,这也是Qua

  • vue-cli开发时,关于ajax跨域的解决方法(推荐)

    目的:使用vue-cli构建的项目,在开发时,想要访问后台接口获取数据,这时就会出现跨域问题. 在config/index.js中进行如下配置 [即在进行ajax请求时,地址中任何以/api开头的请求地址都被解析为目标地址,target就是你想要的后台接口地址] proxyTable: { '/api': { target: 'https://188.188.18.8', changeOrigin: true, pathRewrite: { '^/api': " } } } "` vu

  • JQuery Ajax 跨域访问的解决方案

    具体情况有: 一.本域和子域的相互访问: http://www.aa.com/和book.aa.com 二.本域和其他域的相互访问: http://www.aa.com/和http://www.bb.com/ 用 iframe 三.本域和其他域的相互访问: http://www.aa.com/和http://www.bb.com/ 用 XMLHttpRequest访问代理 四.本域和其他域的相互访问: http://www.aa.com/和http://www.bb.com/ 用 JS创建动态脚

随机推荐