当前位置:首页 > VUE

vue实现登录拦截

2026-03-07 19:24:54VUE

路由守卫实现登录拦截

在Vue项目中,可以通过路由守卫(Navigation Guards)实现登录拦截功能。路由守卫主要分为全局守卫、路由独享守卫和组件内守卫三种类型。

// 在router/index.js中配置全局前置守卫
router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token') // 检查是否存在token
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth) // 检查路由是否需要认证

  if (requiresAuth && !isAuthenticated) {
    next('/login') // 跳转到登录页
  } else if (to.path === '/login' && isAuthenticated) {
    next('/') // 已登录用户访问登录页时跳转到首页
  } else {
    next() // 正常放行
  }
})

路由元信息配置

在路由配置中,可以通过meta字段标记哪些路由需要登录才能访问:

const routes = [
  {
    path: '/dashboard',
    component: Dashboard,
    meta: { requiresAuth: true }
  },
  {
    path: '/login',
    component: Login
  }
]

登录状态管理

建议使用Vuex集中管理登录状态,而不是仅依赖localStorage:

// store/index.js
export default new Vuex.Store({
  state: {
    token: localStorage.getItem('token') || null
  },
  mutations: {
    setToken(state, token) {
      state.token = token
      localStorage.setItem('token', token)
    },
    clearToken(state) {
      state.token = null
      localStorage.removeItem('token')
    }
  }
})

登录逻辑实现

在登录组件中处理登录成功后设置token:

methods: {
  async handleLogin() {
    try {
      const res = await loginApi(this.form) // 调用登录接口
      this.$store.commit('setToken', res.data.token) // 存储token
      this.$router.push(this.$route.query.redirect || '/') // 跳转到原访问页面或首页
    } catch (error) {
      console.error('登录失败', error)
    }
  }
}

响应拦截器处理

在axios拦截器中可以统一处理401未授权情况:

axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      store.commit('clearToken')
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

动态路由处理

对于权限复杂的系统,可以结合动态路由实现更精细的控制:

// 登录后根据权限动态添加路由
function addDynamicRoutes() {
  const routes = generateRoutesBasedOnPermission() // 根据权限生成路由
  router.addRoutes(routes)
}

退出登录处理

实现退出功能时需要清除认证信息:

vue实现登录拦截

methods: {
  logout() {
    this.$store.commit('clearToken')
    this.$router.push('/login')
  }
}

标签: vue
分享给朋友:

相关文章

vue 实现闪烁

vue 实现闪烁

Vue 实现闪烁效果的方法 方法一:使用 CSS 动画 在 Vue 组件中定义一个闪烁的 CSS 动画,通过绑定 class 或 style 来控制元素的闪烁效果。 <template>…

vue实现setinterval

vue实现setinterval

在 Vue 中使用 setInterval Vue 中可以通过生命周期钩子和方法结合 setInterval 实现定时任务。以下是一个完整的实现示例: <template> <…

vue实现翻译

vue实现翻译

Vue 实现翻译功能的方法 使用 i18n 插件实现多语言切换 安装 vue-i18n 插件: npm install vue-i18n 创建语言资源文件(如 en.json 和 zh.json):…

vue 实现树状

vue 实现树状

Vue 实现树状结构的方法 递归组件实现树状结构 递归组件是 Vue 中实现树状结构的常见方法。通过组件自身调用自身,可以轻松构建多层级树状结构。 <template> <ul…

vue 实现工具

vue 实现工具

Vue 实现工具的方法 使用 Vue 实现工具功能可以通过多种方式完成,具体取决于工具的类型和需求。以下是几种常见的方法: 组件化实现 创建一个独立的 Vue 组件来封装工具功能。例如,实现一个计…

vue实现布局

vue实现布局

Vue 实现布局方法 Vue 提供了多种方式实现页面布局,可以通过组件化、CSS 框架或自定义样式完成。以下是几种常见方法: 使用 CSS Flexbox 或 Grid 通过 Vue 单文件组件结合…