当前位置:首页 > VUE

vue怎么实现登录拦截

2026-01-22 14:20:03VUE

路由守卫实现登录拦截

在Vue中可以通过vue-router的路由守卫功能实现登录拦截。路由守卫分为全局守卫、路由独享守卫和组件内守卫,登录拦截通常使用全局前置守卫beforeEach

// router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import store from '../store'

Vue.use(Router)

const router = new Router({
  routes: [
    // 路由配置
  ]
})

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!store.getters.isLoggedIn) {
      next({
        path: '/login',
        query: { redirect: to.fullPath }
      })
    } else {
      next()
    }
  } else {
    next()
  }
})

路由配置添加元信息

在路由配置中通过meta字段标记需要登录验证的路由:

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

状态管理配合

通常需要配合Vuex状态管理来存储和检查登录状态:

vue怎么实现登录拦截

// store/index.js
export default new Vuex.Store({
  state: {
    token: null,
    user: null
  },
  getters: {
    isLoggedIn: state => !!state.token
  },
  mutations: {
    setUser(state, user) {
      state.user = user
    },
    setToken(state, token) {
      state.token = token
    }
  }
})

登录逻辑实现

在登录组件中处理登录成功后保存凭证并跳转:

methods: {
  login() {
    axios.post('/api/login', this.credentials)
      .then(response => {
        this.$store.commit('setToken', response.data.token)
        this.$store.commit('setUser', response.data.user)

        const redirect = this.$route.query.redirect || '/'
        this.$router.push(redirect)
      })
  }
}

响应拦截处理

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

vue怎么实现登录拦截

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

本地存储持久化

为了保持登录状态,可以将token存入本地存储:

// 登录成功后
localStorage.setItem('token', token)

// 初始化时检查
if (localStorage.getItem('token')) {
  store.commit('setToken', localStorage.getItem('token'))
}

退出登录处理

退出登录时需要清除所有认证信息:

methods: {
  logout() {
    this.$store.commit('setToken', null)
    this.$store.commit('setUser', null)
    localStorage.removeItem('token')
    this.$router.push('/login')
  }
}

标签: vue
分享给朋友:

相关文章

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transit…

vue实现选择

vue实现选择

Vue 实现选择功能的方法 在 Vue 中实现选择功能可以通过多种方式完成,以下介绍几种常见的实现方法。 使用 v-model 绑定单选 通过 v-model 可以轻松实现单选功能。以下是一个简单的…

vue实现阻塞

vue实现阻塞

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

vue底部实现

vue底部实现

Vue 底部实现方法 在 Vue 项目中实现底部布局可以通过多种方式完成,以下是一些常见的方法: 使用固定定位 将底部元素固定在页面底部,适用于单页应用或需要始终显示的底部栏。 <temp…

vue实现翻页

vue实现翻页

Vue实现翻页功能 在Vue中实现翻页功能通常需要结合分页组件和数据请求逻辑。以下是常见的实现方法: 使用Element UI分页组件 安装Element UI后,可以直接使用其分页组件: <…

vue 实现上传

vue 实现上传

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