当前位置:首页 > 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 实现人脸识别比对的方法 使用现成的人脸识别 API 通过调用第三方人脸识别 API(如 Face++、百度 AI、腾讯云等)实现比对功能。注册开发者账号获取 API Key 和 Secret,…

vue实现前端

vue实现前端

Vue 实现前端的核心方法与步骤 安装 Vue 项目 使用 Vue CLI 或 Vite 创建项目。Vue CLI 是传统构建工具,Vite 是新一代轻量级工具。 npm init vue@la…

vue实现分栏

vue实现分栏

Vue实现分栏的常见方法 使用CSS Flexbox布局 通过Flexbox可以快速实现分栏效果,适合大多数响应式布局场景 <template> <div class="con…

vue实现阻塞

vue实现阻塞

Vue 实现阻塞的方法 在 Vue 中实现阻塞操作通常涉及异步控制、状态管理或生命周期钩子的使用。以下是几种常见方法: 使用 async/await 处理异步阻塞 通过 async/await 可…

vue 实现上传

vue 实现上传

Vue 实现文件上传 使用 Vue 实现文件上传可以通过原生 HTML 的 <input type="file"> 或第三方库(如 axios、vue-upload-component)完…

vue cli实现原理

vue cli实现原理

Vue CLI 实现原理 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,其核心实现原理可以分为以下几个部分: 核心架构 Vue CLI 采用插件化架构,通过 @vue/cli 提…