当前位置:首页 > VUE

vue 实现登录验证

2026-01-14 01:52:41VUE

Vue 实现登录验证的方法

使用 Vue Router 进行路由守卫

在 Vue 项目中,可以通过 Vue Router 的导航守卫(beforeEach)实现登录验证。未登录用户访问受保护路由时,会被重定向到登录页面。

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

Vue.use(Router)

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

router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token')
  if (to.matched.some(record => record.meta.requiresAuth) && !isAuthenticated) {
    next('/login')
  } else {
    next()
  }
})

export default router

表单验证与 API 请求

在登录页面组件中,实现表单验证并发送登录请求。成功登录后存储 token 并跳转。

// views/Login.vue
<template>
  <form @submit.prevent="handleLogin">
    <input v-model="form.username" type="text" placeholder="Username">
    <input v-model="form.password" type="password" placeholder="Password">
    <button type="submit">Login</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        username: '',
        password: ''
      }
    }
  },
  methods: {
    async handleLogin() {
      try {
        const response = await axios.post('/api/login', this.form)
        localStorage.setItem('token', response.data.token)
        this.$router.push('/home')
      } catch (error) {
        alert('Login failed')
      }
    }
  }
}
</script>

使用 Vuex 管理登录状态

对于更复杂的应用,可以使用 Vuex 集中管理登录状态和用户信息。

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    token: null,
    user: null
  },
  mutations: {
    setToken(state, token) {
      state.token = token
    },
    setUser(state, user) {
      state.user = user
    }
  },
  actions: {
    async login({ commit }, credentials) {
      const response = await axios.post('/api/login', credentials)
      commit('setToken', response.data.token)
      commit('setUser', response.data.user)
    }
  }
})

响应拦截处理 token 过期

在 axios 拦截器中处理 token 过期情况,自动跳转到登录页面。

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

const instance = axios.create()

instance.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      localStorage.removeItem('token')
      window.location.href = '/login'
    }
    return Promise.reject(error)
  }
)

export default instance

组合式 API 实现

使用 Vue 3 的组合式 API 可以更灵活地实现登录验证逻辑。

vue 实现登录验证

// composables/useAuth.js
import { ref } from 'vue'
import { useRouter } from 'vue-router'

export function useAuth() {
  const router = useRouter()
  const isAuthenticated = ref(!!localStorage.getItem('token'))

  const login = async (credentials) => {
    const response = await axios.post('/api/login', credentials)
    localStorage.setItem('token', response.data.token)
    isAuthenticated.value = true
    router.push('/')
  }

  const logout = () => {
    localStorage.removeItem('token')
    isAuthenticated.value = false
    router.push('/login')
  }

  return { isAuthenticated, login, logout }
}

这些方法涵盖了 Vue 中实现登录验证的主要技术点,可以根据项目需求选择合适的实现方式。路由守卫确保页面级保护,Vuex 提供状态管理,axios 拦截器处理全局认证逻辑,而组合式 API 则提供了更现代的代码组织方式。

标签: vue
分享给朋友:

相关文章

vue弹幕实现不重叠

vue弹幕实现不重叠

实现 Vue 弹幕不重叠的方法 CSS 定位与动画控制 通过绝对定位和动态计算弹幕轨道高度,确保弹幕在不同轨道上运行。每条弹幕占据固定高度的轨道,避免重叠。 // 弹幕轨道高度计算 const tr…

vue 移动端实现签名

vue 移动端实现签名

Vue 移动端签名实现方法 在移动端实现签名功能,可以通过HTML5的Canvas结合触摸事件完成。以下是具体实现步骤: 使用Canvas绘制签名 安装vue-signature-pad插件或直接使…

vue自己实现下拉导航

vue自己实现下拉导航

实现下拉导航的基本思路 在Vue中实现下拉导航,可以通过结合Vue的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…

vue实现菜单栏锚点

vue实现菜单栏锚点

实现锚点菜单的基本思路 在Vue中实现菜单栏锚点功能,主要涉及两个方面:创建可跳转的锚点位置,以及菜单项的点击滚动控制。通过监听滚动事件可以高亮当前可见区域的对应菜单项。 创建页面锚点位置 在需要跳…

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身:…

vue实现markdown

vue实现markdown

Vue 实现 Markdown 编辑器 在 Vue 中实现 Markdown 编辑器可以通过集成第三方库或自定义解析器完成。以下是两种常见方法: 使用第三方库(如 marked 或 markdown…