我正在判断jwt令牌是否在我的route guard中过期.但它是在无限循环中运行的.我不明白为什么它不起作用.以下是我的代码:

路由守卫

const parseJwt = (token) => {
    const base64Url = token.split('.')[1]
    const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/')
    const jsonPayload = decodeURIComponent(Buffer.from(base64, 'base64').toString('ascii').split('')
      .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''))

    return JSON.parse(jsonPayload)
  }

  Router.beforeEach((to, from, next) => {
    if (to.matched.some(record => record.meta.requiresAuth)) {
      // need to login
      if (localStorage.getItem('token') === null) {
        next({
          path: '/login',
          params: { nextUrl: to.fullPath }
        })
      } else if (localStorage.getItem('token') && (parseJwt(localStorage.getItem('token')).exp < Date.now() / 1000)) {
        console.log('token expired')
        next({
          path: '/login',
          params: { nextUrl: to.fullPath }
        })
      } else {
        next()
      }
    } else {
      if (localStorage.getItem('token') && to.name === 'Login') {
        return next({ path: '/' })
      }
      return next()
    }
  })

在我的路由中,只有登录名需要验证为true.js.

{
    path: '/login',
    name: 'Login',
    component: () => import('pages/auth/Login.vue'),
    meta: { requiresAuth: false }
  }

我无法理解这部分代码正在返回无限循环:

next({
          path: '/login',
          params: { nextUrl: to.fullPath }
        })

非常感谢您的帮助.

非常感谢.

推荐答案

我认为问题就在这里

  if (localStorage.getItem('token') && to.name === 'Login') {
    return next({ path: '/' })
  }

假设我有 token ,但它已经过期了.导航卫士会将我重定向到登录页面,这会将我重定向到主页(因为它只判断令牌是否存在,并认为我已通过身份验证),这会再次将我重定向到登录页面...这是我们的无限循环

因此,您还应该判断令牌在这种情况下是否已过期:

const token = localStorage.getItem('token')
const isExpiredToken = parseJwt(token).exp < Date.now() / 1000

if (token && !isExpiredToken && to.name === 'Login') {
  return next({ path: '/' })
}

Vue.js相关问答推荐

如何用其他组件编译Vue模板?

Vue.js编译的render函数不起作用

如果找不到路由,Vue.js如何重定向到公共路由

我可以在未注册的组件上构建 Vue.js 失败吗?

如何在 Vuetify v-data-table 上对齐标题

运行vue-cli-service build --watch时没有 CSS 文件

如何使用带有自定义标签和类的`transition-group`

Express.js + lint 出错

如何更新手动安装的 vue 组件上的props?

Vuetify v-select 组件宽度变化

如何创建 vuetify 工具栏链接下拉菜单?

从 Url 中删除查询字符串参数

JavaScript/VueJS:判断数组是否包含具有特定值元素的对象

Laravel Blade 模板将数据传递给 Vue JS 组件

Vuejs模板继承

如何让 vuetify 数据表在卡片内时跨越容器的整个宽度?

无法访问手表处理程序 vuejs 中的数据变量

带有 Firebase 云消息传递的 Vue pwa 无法正常工作

单击 v-select 项目时如何获取对象而不是单个值?

在 Vuex 模块中进行继承的方法