当前位置:首页 > 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 项目中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm install…

vue grid实现

vue grid实现

Vue Grid 实现方法 在 Vue 中实现网格布局可以通过多种方式完成,包括使用原生 CSS Grid、第三方组件库或自定义组件。以下是几种常见方法: 使用原生 CSS Grid 通过 Vue…

vue实现异步

vue实现异步

Vue 实现异步操作的常见方法 Vue 提供了多种方式来处理异步操作,包括数据获取、事件处理等场景。 使用 async/await 在 Vue 方法中可以直接使用 async/await 语法处理异…

vue实现cs

vue实现cs

Vue 实现 CS(Client-Side)渲染的常见方法 Vue.js 是一个用于构建用户界面的渐进式框架,默认采用客户端渲染(CSR)。以下是几种常见的实现方式: 使用 Vue CLI 创建项目…

vue实现看板

vue实现看板

Vue 实现看板功能 使用 Vue 实现看板功能可以通过组件化开发、状态管理和拖拽库结合完成。以下是一个完整的实现方案: 基础项目结构 src/ ├── components/ │ ├── Ka…

vue实现toast

vue实现toast

Vue 实现 Toast 的方法 使用第三方库(推荐) 对于快速实现 Toast 功能,推荐使用成熟的第三方库如 vue-toastification 或 vant 的 Toast 组件。 安装 v…