实际开发中,通过iframe跨域传递数据

实际开发中,通过iframe跨域传递数据

业务背景

基于先前的独立的两个或者多个子系统,开发一个具有单点登录的门户系统, 取消子系统的登录逻辑, 通过门户的单点登录访问所有子系统。

核心: 跨域传递token令牌

源头传递token

ts 复制代码
/**
* data: 传递的动态数据,例如token
* origin: 子系统的访问url
* systemName?: 子系统名字
*/
const postMessageByIframe = (data: any, origin: string, systemName?: string) => {
	if (!origin) return
	const iframe = document.createElement('iframe')
	iframe.style.display = 'none'
	iframe.src = origin
	document.body.append(iframe)

	iframe.onload = () => {
		iframe.contentWindow?.postMessage({ token: data, systemName }, '*')

		setTimeout(() => {
			window.location.href = origin
			// window.open(origin)
		}, 50)

		setTimeout(() => {
			iframe.remove()
		}, 5000)
	}
}

子系统接收跨域传来的数据:token

在App.vue里面

ts 复制代码
window.addEventListener('message', (event) => {
  const { data } = event;
  // 只接受信任源列表发来的数据
  saveToken(data.token);
  localStorage.setItem('currentNavPoi', data.systemName);
});

注意:

使用iframe时, 请关闭浏览器上的 vue、react的开发中工具, 例如 dev-tools, 不然window.addEventListener获取不到传递过来的值

使用iframe时, 请关闭浏览器上的 vue、react的开发中工具, 例如 dev-tools, 不然window.addEventListener获取不到传递过来的值

使用iframe时, 请关闭浏览器上的 vue、react的开发中工具, 例如 dev-tools, 不然window.addEventListener获取不到传递过来的值

相关推荐
Dreamy smile2 分钟前
css :nth-child() 完全用法指南
前端·css
Southern Wind3 分钟前
从零开始封装一个优雅的图片上传组件 - 二次改装 Layui-Upload 的教程(附完整封装代码)
前端·javascript·html·layui·css3
小白菜学前端5 分钟前
Vue3 + TS 解决 ESLint 与 Prettier 格式化冲突
前端·javascript·vue.js
第二只羽毛10 分钟前
搜索引擎项目
大数据·前端·c++·搜索引擎·vim
The_era_achievs_hero14 分钟前
封装api方法(全面)
前端·javascript·uni-app·api·封装接口
一殊酒17 分钟前
【前端开发】Vue项目多客户配置自动化方案【二】
javascript·vue.js·自动化
Mr Xu_18 分钟前
深入解析 getBoundingClientRect 与 offsetTop:解决 Vue 平滑滚动偏移误差问题
前端·javascript·vue.js
Mr-Wanter18 分钟前
vue 解决img图片路径存在但图片无法访问时显示错误的问题
前端·vue·img
muddjsv18 分钟前
近些年前端开发主流技术全景:趋势、工具与实践指南
前端