当前位置:首页 > VUE

vue实现jwt登录

2026-02-19 21:33:44VUE

实现JWT登录的Vue方案

安装依赖 确保项目已安装axiosjwt-decode,用于HTTP请求和JWT解码:

npm install axios jwt-decode

配置Axios实例

创建src/utils/request.js文件,配置全局请求拦截器:

import axios from 'axios'
import router from '../router'

const service = axios.create({
  baseURL: process.env.VUE_APP_API_URL,
  timeout: 5000
})

service.interceptors.request.use(config => {
  const token = localStorage.getItem('token')
  if (token) {
    config.headers['Authorization'] = `Bearer ${token}`
  }
  return config
})

service.interceptors.response.use(
  response => response.data,
  error => {
    if (error.response.status === 401) {
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

export default service

登录逻辑实现

在登录组件中处理认证流程:

vue实现jwt登录

import request from '@/utils/request'
import jwt_decode from 'jwt-decode'

export default {
  methods: {
    async handleLogin() {
      try {
        const res = await request.post('/auth/login', {
          username: this.username,
          password: this.password
        })

        localStorage.setItem('token', res.token)
        const decoded = jwt_decode(res.token)
        this.$store.commit('setUser', decoded)
        this.$router.push('/dashboard')
      } catch (error) {
        console.error('Login failed:', error)
      }
    }
  }
}

路由守卫配置

src/router/index.js中添加全局前置守卫:

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

状态管理

Vuex存储用户信息(src/store/index.js):

vue实现jwt登录

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    user: null
  },
  mutations: {
    setUser(state, user) {
      state.user = user
    },
    clearUser(state) {
      state.user = null
    }
  }
})

令牌刷新机制

实现静默刷新逻辑:

function refreshToken() {
  const refreshToken = localStorage.getItem('refresh_token')
  return request.post('/auth/refresh', { refreshToken })
    .then(res => {
      localStorage.setItem('token', res.token)
      return res.token
    })
}

安全注意事项

  1. 始终使用HTTPS传输令牌
  2. 避免在localStorage存储敏感信息
  3. 设置合理的令牌过期时间
  4. 实现服务端的令牌黑名单机制
  5. 前端应定期检查令牌有效期

注销处理

清除本地存储的令牌和状态:

logout() {
  localStorage.removeItem('token')
  this.$store.commit('clearUser')
  this.$router.push('/login')
}

标签: vuejwt
分享给朋友:

相关文章

vue实现键盘

vue实现键盘

Vue 实现键盘功能 在Vue中实现键盘功能通常涉及监听键盘事件、处理输入以及渲染虚拟键盘界面。以下是几种常见的实现方式: 监听键盘事件 通过@keydown或@keyup指令监听键盘事件,适用于需…

vue实现粘贴

vue实现粘贴

Vue 实现粘贴功能的方法 在 Vue 中实现粘贴功能通常涉及监听粘贴事件并处理剪贴板数据。以下是几种常见的实现方式: 监听原生粘贴事件 通过 @paste 指令或原生 addEventListen…

vue实现博客

vue实现博客

Vue 实现博客的基本步骤 使用 Vue.js 实现一个博客系统可以分为前端和后端两部分。以下是基于 Vue 的前端实现方案,后端可以选择 Node.js、Django 或其他框架。 项目初始化 使…

vue mvvm实现

vue mvvm实现

Vue MVVM 实现原理 Vue.js 是一个基于 MVVM(Model-View-ViewModel)模式的框架,其核心是通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 M…

vue实现双向

vue实现双向

Vue 实现双向绑定的方法 Vue 的双向绑定主要通过 v-model 指令实现,它结合了数据绑定和事件监听,适用于表单元素(如 input、select、textarea 等)。以下是几种常见的实现…

vue简单实现

vue简单实现

Vue 简单实现示例 以下是一个使用 Vue.js 创建简单应用的示例,涵盖基本功能如数据绑定、事件处理和组件化。 基础 HTML 结构 <!DOCTYPE html> <ht…