当前位置: 首页 > article >正文

vue 前端 用iframe实现单点登录两个不同域名Vue项目相互跳转并且传递Token

什么是单点登录

单点登录,字面意思 :仅点一次就可以登录。

在公司的业务系统中,往往会有多个系统,并且这几个系统对应的都是同一个登录接口。次次登录对于公司用户体验肯定是不好的,对于后端上请求登录接口的频率也会增多。所以就有了这个单点登录:多个系统使用同一个登录接口,只需要登录一次就可以使得多个系统免登进入。

A网页:

 data: function() {
        return {         
            qdmDdUrl: 'http://127.0.0.1:8081/#/Loginst?dd=1',
            Isdddl: false

        };
    },



Jumpshuangd() {
            var that = this;
            this.Isdddl = true;
            var token = '',  username = 'AAA', password = 'BBB';
            axios
                .ajax({
                    url: 'xxxxxxxxxx',
                    method: 'post',
                    isShowLoading: false,
                    data: {
                        username: username,
                        password: password,                   
                    }
                }).then(res => {
                token = res.data.access_token;             
                const iframe = document.createElement('iframe');
                //设置iframe样式,使其不可见
                iframe.setAttribute(
                    'style',
                    'position:absolute;width:10px;height:10px;left:-20px;top:-20px;'
                );
                iframe.setAttribute(
                    'allow',
                    'payment'
                );
                //将iframe地址改为目标系统
                iframe.src = this.qdmDdUrl;
                document.body.append(iframe);
                iframe.onload = () => {
                    iframe.contentWindow.postMessage(
                        { token: token, name: username },//可以以对象形式传参,也可以直接传字符串"aaa"
                        that.qdmDdUrl//嵌入页面的路径,也可以直接传"*"
                    );
                    setTimeout(function() {
                        iframe.remove();
                    }, 5000);
                    // //新开页签,跳转到目标系统地址
                    setTimeout(function() {
                        that.Isdddl = false;
                        window.open('http://127.0.0.1:8081/#/dashboard', '_blank');
                    }, 2000);
                };
            });
        }

需要实现免登录的子系统,可在index.html中添加:

created() {
        let that=this;
        // 父页面发送的消息
        let dd = this.$route.query.dd;
        if (dd == 1) {
            window.parent.postMessage('childLoaded', '*');
            window.addEventListener('message',e => {
                const origin = [
                    'http://http://127.0.0.1:8081',
                    'http://http://127.0.0.1:8080',
                     .....
                ]
                if(origin.includes(event.origin)){
                      if (e.data.type == undefined) {                     
                        
                        window.localStorage.setItem('cookie', event.data.tooken)          
                      }
                }
            })
        }
    },

http://www.kler.cn/a/455718.html

相关文章:

  • 【Android】application@label 属性属性冲突报错
  • 功能测试和接口测试
  • uniapp实现为微信小程序扫一扫的功能
  • v语言介绍
  • Educational Codeforces Round 173 (Rated for Div. 2) - Codeforces
  • pdf有密码,如何实现pdf转换word?
  • 如何使用缓存技术提升Python爬虫效率
  • 鸿蒙Next状态管理V2 - @Once初始化用法总结
  • 设计模式之享元模式:看19路棋盘如何做到一子千面
  • 【视觉惯性SLAM:六、图优化库(1):g2o的使用指南】
  • 自动化办公-合并多个excel
  • AI自动化编程:解放双手还是抢夺饭碗?
  • 点击标题滚动到指定模块
  • 【深度学习基础|pip安装】pip 安装深度学习库常见错误及解决方案,附案例。
  • clickhouse复现修复 结构需要清理 错误 structure need clean
  • 达梦数据守护搭建
  • SpringBoot后端开发常用工具详细介绍——SpringDoc接口文档
  • termux下ubuntu换arm清华源
  • 攻防世界 easyphp
  • RFID智能文件柜:高效安全的档案管理新方案
  • Windows电脑部署SD 3.5结合内网穿透随时随地生成高质量AI图像
  • 使用 HTML 和 CSS 实现绚丽的节日烟花效果
  • 蓝桥杯——冒险者公会
  • Qt之数据库使用(十四)
  • 计算机网络实验室建设方案
  • 72 mysql 的客户端和服务器交互 returnGeneratedKeys