导航守卫的使用记录和beforeEach( )死循环的问题

前置导航守卫beforeEach的使用

js 复制代码
import Vue from 'vue'
import VueRouter from 'vue-router'
// 进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

Vue.use(VueRouter)

// 路由表
const routes = [
  {
    path: "/",
    redirect: "/home",
  },
  {
    path: '/home',
    name: 'Home',
    component: () => import('../views/Home.vue')
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('../views/Login.vue')
  },

]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

// 前置导航守卫
router.beforeEach((to,from,next) => {
  // 开启进度条
  NProgress.start()
  
  if ( localStorage.getItem('Token') ) { // 如果已经登录,就直接放行
    next()
  }else{ // 如果没有登录,需要判断要跳转的页面是否是登录页,如果是就直接放行,如果不是就跳到登录页
    if( to.path == '/login' ) {
      next()
    }else {
      next('/login')
    }
  }
})

export default router

在进行拦截之前要在登录成功后把用户token存储到localStorage中

js 复制代码
    login() {  
      this.$refs.loginForm.validate(async valid => {  
        if (valid) { 
          let { password,username,key } = this.loginForm;
          let res = await PassWordlogin({
            'password': Encrypt(password),//密码(需要使用AES加密)
            'username': Encrypt(username),//用户名(需要使用AES加密)
            'key': this.captcha.key,//图形验证码中随机UUID
            'captcha': key
          })
          if( res.code != '200' ) return
          // 登录成功后存储localStorage,并且跳转路由
          localStorage.setItem('Token',res.data);
          this.$router.push('/')

        } else {  
          console.log('表单验证失败!');  
          return false;  
        }  
      });  
    },

当时在做这一部分时遇到一个问题,就是beforeEach出现了死循环,导致死循环的代码如下

javascript 复制代码
router.beforeEach((to, from, next) => {
  if (localStorage.getItem('token') === null) {
    console.log('出现死循环了');
    // 重定向到登录页面去
    next({
      path: '/login'
    });
  } else {
    next();
  }
});

router.beforeEach( )死循环的问题

上面代码会导致页面是空白的,猜测是因为当我们刷新 http://localhost:8080/ 后先会执行 router.beforeEach( ) 该方法,因为我们还没有登录,所以获取到本地存储的token为null,会重定向到 /login 登录页面去,重定向到这个页面就会再次执行beforeEach( )方法,造成死循环。把它改成下面这种就可以了

javascript 复制代码
router.beforeEach((to, from, next) => {
  if ( localStorage.getItem('Token') ) { // 如果已经登录,就直接放行
    next()
  }else{ // 如果没有登录,需要判断要跳转的页面是否是登录页,如果是就直接放行,如果不是就跳到登录页
    if( to.path == '/login' ) {
      next()
    }else {
      next('/login')
    }
  }
});
相关推荐
Irene1991几秒前
Vue 3中:setup 函数接收两个重要参数:props 和 context(附:setup 中无法访问 this 详解)
vue.js·setup
念你那丝微笑6 分钟前
uView Plus + Vue3 + TypeScript + UniApp 正确引入 UnoCSS(避坑版)
vue.js·typescript·uni-app
Van_captain9 分钟前
React Native for OpenHarmony Toast 轻提示组件:自动消失的操作反馈
javascript·开源·harmonyos
内存不泄露9 分钟前
基于Spring Boot和Vue的宠物医院管理系统设计与实现
vue.js·spring boot·信息可视化
Van_captain18 分钟前
React Native for OpenHarmony Modal 模态框组件:阻断式交互的设计与实现
javascript·开源·harmonyos
xkxnq18 分钟前
第一阶段:Vue 基础入门(第 14天)
前端·javascript·vue.js
前端小臻18 分钟前
列举react中类组件和函数组件常用到的方法
前端·javascript·react.js
筱歌儿24 分钟前
TinyMCE-----word表格本地图片转base64并上传
前端·word
研☆香24 分钟前
html css js文件开发规范
javascript·css·html
0思必得025 分钟前
[Web自动化] Selenium简单使用
前端·python·selenium·自动化·web自动化