跨子系统带TOKEN跳转

对于一个稍大点的项目来说,必然存在着分久必合,合久必分的历史周期律。

原系统X,被拆成A和B两个子系统,现在又需要在A系统上通过点击按钮跳转到B系统上。好在之前的拆分并不是很彻底,A、B两个子系统是共用一个框架数据库的,redis也是共用的。只需要在jeecg框架的束缚下将A系统的token传递给B系统,并在B系统上初始化一些必要的信息(基本用户信息,项目信息,缓存等等)即可。

OK,首先需要在A系统上创建一个按钮,该按钮对应一个vue页面,我们在这个Vue页面里面完成3件事:1、拿B系统的地址;2、拿A系统的token、3、跳转。

<template>
  <div>
    正在跳转,请稍等...
  </div>
</template>

<script>
  import Vue from 'vue'
  import { ACCESS_TOKEN } from '@/store/mutation-types'
  export default {
    name: 'JumpByToken',
    data(){
    },
    mounted() {
      const urlParams = new URLSearchParams(window.location.search)
      let jumpUrl = urlParams.get('jump')
      if(!jumpUrl){
        this.$message.error('未设置jump地址!')
        return;
      }
      const token = Vue.ls.get(ACCESS_TOKEN);
      if(!token){
        this.$message.error('未找到TOKEN!')
        return;
      }
      jumpUrl += "?token=" + token;
      window.location.href = jumpUrl;
    },
    methods: {
    }
  }
</script>

还需要在router.config.js配置路由:

  {
    path: '/jumpByToken', component: () => import('@/views/user/JumpByToken'), hidden: true
  },

同时在框架的菜单配置里,将菜单路径配置为:http://A机器地址/a/jumpByToken?jump=http://B机器地址/b/user/login。将前端组件改为:layouts/IframePageView;勾选打开方式为外部。

至此,点击A系统配置的跳转按钮后,可以看到,浏览器打开新tab到B项目,且token以url参数形式传递到B系统。修改B系统的对应vue:

mounted() {
      const urlParams = new URLSearchParams(window.location.search)
      const token = urlParams.get('token')
      if(token) {
        Vue.ls.set(ACCESS_TOKEN, token, 7 * 24 * 60 * 60 * 1000)
        getAction("/sys/user/getUserInfo", {}).then(res => {
          if(res.success) {
            let userInfo = res.result.userInfo;
            Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000)
            this.initData();
          }
        })
      }
    },

在B系统对应的页面(也就是登录页面),完成token的获取和存储、其他必要信息的获取,以及登录成功的自动跳转。

BH6AOL

我们正在前进!