0,来执控制他不执行跳转到别处。_vue从一个项目跳转到另一个项目并且 退出登录没跳">
当前位置:   article > 正文

外部链接和VUE项目互相跳转实现退出登录_vue从一个项目跳转到另一个项目并且 退出登录没跳到login页面

vue从一个项目跳转到另一个项目并且 退出登录没跳到login页面

一、补坑总结提前说明
我的项目有一个前台MVC项目门户站点(用户登录信息存储在cookie),和后台vue项目(用户登录信息存储在localstorage)站点,2个站点分属不同的端口,那就是跨域了。之前我已经实现过了某个站点登录后,可以直接进入对方站点实现自动登录,也就是单点登录的效果,现在我要实现单点退出登录的效果,其实按理说原理跟登录是差不多的。参考之前写的单点登录跳转文章外部链接跳转到vue项目传递参数实现单点登录_吹牛不交税的博客-CSDN博客

但是我碰到了巨坑,折腾了我一天,大致总结如下:
http://localhost:9990//loginout?from=portal  昨天一直用的这个链接去跳转后台退出登录,但是到了后台之后,有个
const router = createRouter({
  history: myhistory, //createWebHistory(process.env.BASE_URL),
  routes
})
这里总是会人为的给链接路由换成/home。    然后我早上上厕所的时候想了一下之前登录成功跳转的链接,他是带了参了#/home/ 和参数过去,登录跳转可以,那我就把登录跳转的#/home/  放到前面,后面再加loginout和参数,变成下面这样,
http://localhost:9990/#/home/loginout?dXNlck5hbWU9dW5kZWZpbmVkJnVzZXJfSWQ9dW5kZWZpbmVkJmltZz11bmRlZmluZWQmdG9rZW49dW5kZWZpbmVk&from=portal
 他就不会直接把路由替换成 /home了,原因是啥我也不知道  ,createRouter 是vue内部函数,我昨天调试了很久都没调试出所以然。 
这策略就是变成了,我打不过他我就顺从他。

二、vue项目退出登录后跳转门户mvc项目的退出登录地址。

我的vue项目,原始退出登录的代码他就是一个函数调用store.commit('clearUserInfo', ''); 清除用户信息在前端的缓存,然后通过跳转跟路径"/"让系统自动判断重新跳转到登录路由就完事了。
那我现在想要在执行完跳转的时候还要跳转到别的站点链接,我就得单独做一个loginout的路由页面。

1、 loginout.vue路由文件代码,我开始尝试了想动态生成iframe,通过iframe的src属性执行外部链接,但是失败了,但是里面关于生成iframe的代码我没有删除,关于跳转最重要的几句就是下面的这几行。myhostname变量是站点根域名或者IP,http.portalUrl是端口(配置的门户站点端口),from=houtai用来告诉门户,是从后台跳转过去的请求,而且这里也有判断是否从门户跳转过来的链接(from=portal),如果是门户跳转过来的链接,就不能再跳转回去了,那就成了多次循环跳转了。

 let myhostname = location.hostname;
    let portal_loginout = "http://" + myhostname + ":" + http.portalUrl + "index/loginout?from=houtai";    
    if (location.href.indexOf("from=portal") < 0) {    
      location.href = portal_loginout;
    }

  1. <template>
  2. <div id="divdom" ref="divdom">
  3. <!-- <iframe id="myframe"></iframe> -->
  4. </div>
  5. </template>
  6. <script>
  7. import loading from "@/components/basic/RouterLoading";
  8. import VolMenu from "@/components/basic/VolElementMenu.vue";
  9. import Message from "./index/Message.vue";
  10. import MessageConfig from "./index/MessageConfig.js";
  11. import {
  12. defineComponent,
  13. reactive,
  14. ref,
  15. watch,
  16. onMounted,
  17. getCurrentInstance,
  18. } from "vue";
  19. import { useRouter, useRoute } from "vue-router";
  20. import store from "../store/index";
  21. import http from "@/../src/api/http.js";
  22. import { HttpResponse } from "@microsoft/signalr";
  23. import base64 from 'js-base64';
  24. const jsBase64 = require('js-base64').Base64; //js-base64 加密
  25. export default defineComponent({
  26. components: {
  27. },
  28. data() {
  29. return {
  30. // contextMenuVisible: false, // 右键关闭显/
  31. };
  32. },
  33. setup(props, context) {
  34. store.commit('clearUserInfo', '');
  35. const loading = ref(false);
  36. const codeImgSrc = ref('');
  37. const userInfo = reactive({
  38. userName: '',
  39. password: '',
  40. verificationCode: '',
  41. UUID: undefined
  42. });
  43. let appContext = getCurrentInstance().appContext;
  44. let $message = appContext.config.globalProperties.$message;
  45. let router = useRouter();
  46. $message.success('退出成功,正在跳转!');
  47. return {
  48. loading,
  49. codeImgSrc,
  50. userInfo,
  51. };
  52. },
  53. /**
  54. * 挂载钩子函数
  55. */
  56. mounted() {
  57. // alert("111");
  58. // debugger;
  59. let myhostname = location.hostname;
  60. let portal_loginout = "http://" + myhostname + ":" + http.portalUrl + "index/loginout?from=houtai";
  61. // alert(portal_loginout);
  62. let mydom = this.$refs.divdom;
  63. if (location.href.indexOf("from=portal") < 0) {
  64. // this.createIframe(mydom, portal_loginout, null);
  65. location.href = portal_loginout;
  66. }
  67. },
  68. methods: {
  69. /**
  70. * 动态创建iframe
  71. * @param dom 创建iframe的容器,即在dom中创建iframe。dom能够是div、span或者其它标签。
  72. * @param src iframe中打开的网页路径
  73. * @param onload iframe载入完后触发该事件。能够为空
  74. * @return 返回创建的iframe对象
  75. * */
  76. createIframe(dom, src, onload) {
  77. //在document中创建iframe
  78. var iframe = document.createElement("iframe");
  79. //设置iframe的样式
  80. iframe.style.width = "100%";
  81. iframe.style.height = "100%";
  82. iframe.style.margin = "0";
  83. iframe.style.padding = "0";
  84. iframe.style.overflow = "hidden";
  85. iframe.style.border = "none";
  86. //绑定iframe的onload事件,处理事件的兼容问题
  87. if (onload && Object.prototype.toString.call(onload) === "[object Function]") {
  88. if (iframe.attachEvent) {
  89. iframe.attachEvent("onload", onload);
  90. }
  91. else if (iframe.addEventListener) {
  92. iframe.addEventListener("load", onload);
  93. }
  94. else {
  95. iframe.onload = onload;
  96. }
  97. }
  98. iframe.src = src;
  99. //把iframe载入到dom以下
  100. dom.appendChild(iframe);
  101. return iframe;
  102. },
  103. },
  104. created() {
  105. },
  106. /**
  107. * 销毁钩子函数
  108. */
  109. destroyed() {
  110. $this = null;
  111. clearInterval($interval);
  112. },
  113. });
  114. </script>

2、 router/index.js 路由配置文件中,增加一个路由

{

    path: '/loginout',

    name: 'loginout',

    component: () => import('@/views/Loginout.vue'),

    redirect: '/loginout',

    meta: {

      anonymous: true

    }

  },

 这个文件下面还有一个位置router.beforeEach 的时候要增加以下判断  

if(to.fullPath.indexOf("loginout")>0)

  {  

    return next();   

  }

 

3、在退出登录按钮执行的代码位置,加一行代码跳转到loginout路由

 三、门户MVC项目退出登录,然后跳转到后台vue项目的路由

1、退出登录按钮位置的代码

2、loginout路由的后端代码没有写什么东西,就将config配置的后端跳转路由啥的读取存到ViewBag。

ViewBag.adminUrl = _adminUrl;
            ViewBag.portapiurl = _portapiurl;
            return View();

3、loginout.cshtml 文件代码   

重点代码段:

 var cookietokenvalue = $.cookie('portalusertoken');
        var cookieusername = $.cookie('portalusername');
        var portaluserid = $.cookie('portaluserid');
        var portalimg = $.cookie('portalimg'); 
        var portapiurl = $.cookie('_portapiurl');

        var adminUrl = getCookie('_adminUrl');
        adminUrl = $("#hid_adminurl").val() ;

        var myurlhouzhui = "/loginout?" + Base64.encode("userName=" + encodeURI(cookieusername) + "&user_Id=" + portaluserid + "&img=" + portalimg + "&token=" + cookietokenvalue)+"&from=portal";
        if (adminUrl != undefined && adminUrl != null && adminUrl != "null" && adminUrl != "" && location.href.indexOf("&from=houtai") < 0) {
            var myhostname = location.hostname;
            var myadmin_arr = adminUrl.split("%2F");
            var portal_loginout = "http://" + myhostname + ":" + adminUrl + myurlhouzhui;   //"/loginout?from=portal"
            //alert(portal_loginout);
            //var mydom = $("#divdom");
            //var mydom = document.querySelector("divdom");
            //this.createIframe(mydom, portal_loginout, null);
            debugger;
            window.location.href = portal_loginout;
            //window.open(portal_loginout);
        }

  1. @*
  2. For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
  3. *@
  4. @{
  5. Layout = "_Layout.cshtml";
  6. }
  7. <html lang="zh-CN">
  8. <head>
  9. <meta charset="UTF-8" />
  10. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  11. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  12. <meta property="og:title" content="Digital Marketplace Template" />
  13. <meta property="og:type" content="website" />
  14. <meta property="og:url" content="" />
  15. <meta property="og:image" content="" />
  16. <link rel="stylesheet" href="~/portal/assets/css/preloader.css" />
  17. <script src="~/portal/assets/js/preloader.js"></script>
  18. <link rel="stylesheet" href="~/portal/assets/css/vendor/bootstrap.min.css" />
  19. <link rel="stylesheet" href="~/portal/assets/css/vendor/nice-select.css" />
  20. <link rel="stylesheet" href="~/portal/assets/css/vendor/magnific-popup.css" />
  21. <link rel="stylesheet" href="~/portal/assets/css/vendor/slick.css" />
  22. <link rel="stylesheet" href="~/portal/assets/css/vendor/aos.css" />
  23. <link rel="stylesheet" href="~/portal/assets/css/style.css" />
  24. <title>造价师服务平台</title>
  25. <script src="~/portal/assets/js/vendor/jquery.min.js"></script>
  26. <script src="~/portal/assets/js/vendor/jquery.nice-select.min.js"></script>
  27. <script src="~/portal/assets/js/jquery.cookie.min.js"></script>
  28. <script src="~/Scripts/My97DatePicker/WdatePicker.js"></script>
  29. <script src="~/js/js-base64-3.7.5/package/base64.js"></script>
  30. </head>
  31. <body>
  32. <div id="divdom" ref="divdom">
  33. <!-- <iframe id="myframe"></iframe> -->
  34. </div>
  35. <input type="hidden" id="hid_adminurl" value="@ViewBag.adminUrl" />
  36. <input type="hidden" id="hid_portapiurl" value="@ViewBag.portapiurl" />
  37. <script>
  38. /**
  39. * 动态创建iframe
  40. * param dom 创建iframe的容器,即在dom中创建iframe。dom能够是div、span或者其它标签。
  41. * param src iframe中打开的网页路径
  42. * param onload iframe载入完后触发该事件。能够为空
  43. * return 返回创建的iframe对象
  44. * */
  45. function createIframe(dom, src, onload) {
  46. //在document中创建iframe
  47. var iframe = document.createElement("iframe");
  48. //设置iframe的样式
  49. iframe.style.width = "100%";
  50. iframe.style.height = "100%";
  51. iframe.style.margin = "0";
  52. iframe.style.padding = "0";
  53. iframe.style.overflow = "hidden";
  54. iframe.style.border = "none";
  55. //绑定iframe的onload事件,处理事件的兼容问题
  56. if (onload && Object.prototype.toString.call(onload) === "[object Function]") {
  57. if (iframe.attachEvent) {
  58. iframe.attachEvent("onload", onload);
  59. }
  60. else if (iframe.addEventListener) {
  61. iframe.addEventListener("load", onload);
  62. }
  63. else {
  64. iframe.onload = onload;
  65. }
  66. }
  67. iframe.src = src;
  68. //把iframe载入到dom以下
  69. dom.appendChild(iframe);
  70. return iframe;
  71. }
  72. /**
  73. *设置 cookie 值的函数,创建一个函数用于存储访问者的名字
  74. *cname:名称,必须字母
  75. *cvalue:值
  76. *exdays:过期时间(天)
  77. * */
  78. var setCookie = function (cname, cvalue, exdays) {
  79. var d = new Date();
  80. d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
  81. var expires = "expires=" + d.toGMTString();
  82. document.cookie = cname + "=" + cvalue + "; " + expires + ";path=/";
  83. };
  84. //获取 cookie 值的函数,创建一个函数用户返回指定 cookie 的值
  85. //cname:名称,你之前设置的名称
  86. var getCookie = function (cname) {
  87. var name = cname + "=";
  88. var ca = document.cookie.split(';');
  89. for (var i = 0; i < ca.length; i++) {
  90. var c = ca[i].trim();
  91. if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
  92. }
  93. return null;
  94. };
  95. $.ajax({
  96. type: "get",
  97. url: "/index/tologinout",
  98. async: false,
  99. success: function (res) {
  100. debugger;
  101. $.cookie("portalusertoken", null, { path: '/', expires: -1 }); //删除hello
  102. $.cookie("portalusername", null, { path: '/', expires: -1 }); //删除hello
  103. $.cookie("portaluserid", null, { path: '/', expires: 10 }); //删除hello
  104. $.cookie("portalimg", null, { path: '/', expires: 10 }); //删除hello
  105. //重新指向首页
  106. var myhostname = location.hostname;
  107. var port = window.location.port;
  108. var myindexurl = "http://" + myhostname + ":" + port + "/index/index";
  109. location.href = myindexurl;
  110. }
  111. });
  112. $.cookie("portalusertoken", null, { path: '/', expires: -1 }); //删除hello
  113. $.cookie("portalusername", null, { path: '/', expires: -1 }); //删除hello
  114. $.cookie("portaluserid", null, { path: '/', expires: -1 }); //删除hello
  115. $.cookie("portalimg", null, { path: '/', expires: -1 }); //删除hello
  116. //重新指向首页
  117. //var myhostname = location.hostname;
  118. //var port = window.location.port;
  119. //var myindexurl = "http://" + myhostname + ":" + port + "/index/index";
  120. //location.href = myindexurl;
  121. var cookietokenvalue = $.cookie('portalusertoken');
  122. var cookieusername = $.cookie('portalusername');
  123. var portaluserid = $.cookie('portaluserid');
  124. var portalimg = $.cookie('portalimg');
  125. var portapiurl = $.cookie('_portapiurl');
  126. var adminUrl = getCookie('_adminUrl');
  127. adminUrl = $("#hid_adminurl").val() ;
  128. var myurlhouzhui = "/loginout?" + Base64.encode("userName=" + encodeURI(cookieusername) + "&user_Id=" + portaluserid + "&img=" + portalimg + "&token=" + cookietokenvalue)+"&from=portal";
  129. if (adminUrl != undefined && adminUrl != null && adminUrl != "null" && adminUrl != "" && location.href.indexOf("&from=houtai") < 0) {
  130. var myhostname = location.hostname;
  131. var myadmin_arr = adminUrl.split("%2F");
  132. var portal_loginout = "http://" + myhostname + ":" + adminUrl + myurlhouzhui; //"/loginout?from=portal"
  133. //alert(portal_loginout);
  134. //var mydom = $("#divdom");
  135. //var mydom = document.querySelector("divdom");
  136. //this.createIframe(mydom, portal_loginout, null);
  137. debugger;
  138. window.location.href = portal_loginout;
  139. //window.open(portal_loginout);
  140. }
  141. </script>
  142. </body>
  143. </html>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/482940
推荐阅读
相关标签
  

闽ICP备14008679号