vue3:十、页面跳转,根据参数跳转回原访问页面

目的:如果用户在访问某个需要登录的页面时,但是某些信息不存在时(例如token),根据路由守卫的设定,就会跳转到登录页面,但如果在访问页面增加参数redirect=路径值,就可以当用户成功登录时,根据redirect跳转以及当前页面的参数,重新回到刚才访问的页面

一、守卫跳转路径:更换跳转方式

主要对路由守卫后的路径跳转为拼接跳转,携带参数redirect=路径值

路由守卫参考:vue3:九、路由守卫-CSDN博客

路由守卫,这里我采用的都是官方提供的跳转方式:next({ name: 'login' }),现将其转换为拼接路径,就可以标识参数,表明我是从什么页面跳转过来的

1、初始路由守卫

由下代码可知,路径跳转都是采用next({name:'跳转的路径的name值'})进行跳转

//设置系统标题
const SystemTitle = 'SMS后台管理系统';
//设置一个不需要进行登录的页面数组
const NoLogin = ['login', 'not-found', 'test']
//设置路由守卫
router.beforeEach(async(to, from, next) => {
  if (to.meta.title) {
    //拼接新标题
    var newtitle = to.meta.title + '-' + SystemTitle
    document.title = newtitle
  }
  // 判断是否登录
  const token = getToken();
  //如果token不存在
  if (!token) {
    //在NoLogin数组中,表示不需要登录,就直接放行
    if (NoLogin.includes(to.name)) {
      next()
    }
    //如果不在NoLogin数组中,就表示需要登录,没有token就跳转到登录页面
    else {
      next({ name: 'login' })
    }
  }
  //token存在
  else {
    //如果在登录页面,就跳转到首页
    if (to.name == 'login') {
      next({ name: 'main' })
    }
    else {
      //读取用户信息
      const userstore = userStore();
      console.log(userstore)
      if (userstore.username) {
        //放行
        next();
      }
      else {
        //如果token存在,用户信息没查询到就去请求用户信息
        var res = await getuserinfo();
        console.log(res);
        //请求之后,如果请求成功,就设置token,设置用户信息,放行,如果请求失败,就删除token,跳转到登录页面
        if(res.code == 1){
          //设置token和用户信息
          setToken(res.token);
          //将用户信息设置到store中
          userstore.setUserinfo(res.data)
          //放行
          next();
        }
        else{
          //删除token
          delToken();
          //跳转到登录页面
          next({ name: 'login' })
        }
      }
    }
  }
})

2、将原始跳转更改为拼接路径

①路由页面使用拼接路径

可以采用这种方式拼接,跳转到/login页面,并且携带参数redirect,其值为当前的to.path路径信息

next(`/login?redirect=${to.path}`)

②完整代码

//设置系统标题
const SystemTitle = 'SMS后台管理系统';
//设置一个不需要进行登录的页面数组
const NoLogin = ['login', 'not-found', 'test']
//设置路由守卫
router.beforeEach(async(to, from, next) => {
  if (to.meta.title) {
    //拼接新标题
    var newtitle = to.meta.title + '-' + SystemTitle
    document.title = newtitle
  }
  // 判断是否登录
  const token = getToken();
  //如果token不存在
  if (!token) {
    //在NoLogin数组中,表示不需要登录,就直接放行
    if (NoLogin.includes(to.name)) {
      next()
    }
    //如果不在NoLogin数组中,就表示需要登录,没有token就跳转到登录页面
    else {
      // next({ name: 'login' })
      next(`/login?redirect=${to.path}`)
    }
  }
  //token存在
  else {
    //如果在登录页面,就跳转到首页
    if (to.name == 'login') {
      // next({ name: 'main' })
      next('/')
    }
    else {
      //读取用户信息
      const userstore = userStore();
      console.log(userstore)
      if (userstore.username) {
        //放行
        next();
      }
      else {
        //如果token存在,用户信息没查询到就去请求用户信息
        var res = await getuserinfo();
        console.log(res);
        //请求之后&#
Vue2中,你可以通过结合`vue-router`库以及JavaScript的加密算法(比如`crypto-js`)来实现在路由跳转时对参数进行加密并在页面上解密。以下是简单的步骤: 1. **安装依赖**: 首先需要安装`vue-router`和用于加密的库,例如`crypto-js`: ```bash npm install vue-router crypto-js ``` 2. **创建加密函数**: 使用`crypto-js`库中的方法来加密和解密数据。这里我们假设你想要使用AES加密: ```javascript import AES from &#39;crypto-js/aes&#39;; const encrypt = (data, key) => { return AES.encrypt(JSON.stringify(data), key).toString(); }; const decrypt = (encryptedData, key) => { try { const decrypted = AES.decrypt(encryptedData, key); return JSON.parse(decrypted.toString(AES.enc.Utf8)); } catch (e) { console.error(&#39;Decryption failed:&#39;, e); return null; } }; ``` 3. **路由配置**: 在`router.js`中,修改`beforeEach`钩子处理加密和解密参数: ```javascript import Vue from &#39;vue&#39;; import Router from &#39;vue-router&#39;; import store from &#39;./store&#39;; // 获取当前用户的加密密钥(假设从存储或API获取) const getUserKey = () => store.state.userEncryptionKey; const router = new Router({ // ...其他配置 }); router.beforeEach((to, from, next) => { if (to.params && to.params.encryptedData) { const decodedParams = decrypt(to.params.encryptedData, getUserKey()); if (decodedParams) { Object.assign(to.params, decodedParams); // 解密并更新实际传递给组件的参数 } else { console.error(&#39;Invalid or unencrypted data&#39;); next({ path: to.path, query: { error: &#39;decryption_failed&#39; } }); // 或者返错误页面 } } next(); }); 4. **页面接收解密后的参数**: 在需要使用这些参数的组件中,你可以访问`this.$route.params`: ```html <template> <div v-if="data"> <!-- 页面内容 --> {{ data }} </div> </template> <script> export default { computed: { data() { return this.$route.params.data; // 解密的数据将会在这里可用 } }, }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

25号底片~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值