当前位置:首页 > VUE

vue实现登录拦截

2026-03-28 05:33:38VUE

路由拦截实现登录验证

在 Vue 项目中,可以通过路由守卫(navigation guards)实现登录拦截。以下是具体实现方式:

  1. 安装 Vue Router

    npm install vue-router
  2. 配置路由守卫 在 router/index.js 中配置全局前置守卫:

    
    import Vue from 'vue'
    import Router from 'vue-router'
    import Home from '@/views/Home.vue'
    import Login from '@/views/Login.vue'

Vue.use(Router)

const router = new Router({ routes: [ { path: '/', component: Home, meta: { requiresAuth: true } }, { path: '/login', component: Login } ] })

router.beforeEach((to, from, next) => { const isAuthenticated = localStorage.getItem('token')

if (to.matched.some(record => record.meta.requiresAuth)) { if (!isAuthenticated) { next('/login') } else { next() } } else { next() } })

export default router


### 登录状态管理

结合 Vuex 实现更完善的登录状态管理:

1. 创建 auth 模块
```javascript
// store/modules/auth.js
const state = {
  token: localStorage.getItem('token') || '',
  user: null
}

const mutations = {
  SET_TOKEN(state, token) {
    state.token = token
    localStorage.setItem('token', token)
  },
  CLEAR_AUTH(state) {
    state.token = ''
    state.user = null
    localStorage.removeItem('token')
  }
}

const actions = {
  login({ commit }, credentials) {
    return api.login(credentials).then(response => {
      commit('SET_TOKEN', response.data.token)
    })
  },
  logout({ commit }) {
    commit('CLEAR_AUTH')
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

响应拦截处理

在 axios 拦截器中处理未授权情况:

// utils/axios.js
import axios from 'axios'
import router from '@/router'

const instance = axios.create({
  baseURL: process.env.VUE_APP_API_URL
})

instance.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      store.dispatch('auth/logout')
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

export default instance

组件级权限控制

在组件中使用计算属性控制显示:

<template>
  <div v-if="isAuthenticated">
    <!-- 受保护内容 -->
  </div>
</template>

<script>
import { mapState } from 'vuex'

export default {
  computed: {
    ...mapState('auth', ['token']),
    isAuthenticated() {
      return !!this.token
    }
  }
}
</script>

动态路由加载

根据权限动态加载路由:

vue实现登录拦截

// router/index.js
function loadRoutes() {
  const basicRoutes = [
    { path: '/login', component: Login }
  ]

  if (store.state.auth.token) {
    return [
      ...basicRoutes,
      { path: '/dashboard', component: Dashboard, meta: { requiresAuth: true } }
    ]
  }
  return basicRoutes
}

const router = new Router({
  routes: loadRoutes()
})

标签: vue
分享给朋友:

相关文章

vue实现弹窗

vue实现弹窗

Vue 实现弹窗的常见方法 使用组件化方式封装弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏: <template> <…

vue组件实现

vue组件实现

Vue 组件实现基础 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。组件的实现包括定义、注册、数据传递和生命周期管理等。 定义组件 组件可以通过单文件组件(.…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…

vue分页实现

vue分页实现

实现Vue分页的几种方法 使用Element UI的分页组件 安装Element UI库后,可以直接使用其分页组件。以下是一个基本示例: <template> <div>…

vue实现打印

vue实现打印

使用Vue实现打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 方法一:使用window.print() 这种方法适用于打印整个页面或特定区域的内容。 // 在Vu…

vue实现导出excel实现流程

vue实现导出excel实现流程

安装依赖库 需要安装 xlsx 和 file-saver 库来处理 Excel 文件的生成和保存。通过 npm 或 yarn 安装: npm install xlsx file-saver # 或…