当前位置:首页 > 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中实现元素的放大缩小功能,可以通过CSS变换、第三方库或直接操作DOM样式来实现。以下是几种常见的方法: 使用CSS transform属性 通过绑定Vue的d…

vue 实现tabs

vue 实现tabs

Vue 实现 Tabs 组件的方法 使用动态组件和 v-for 在 Vue 中实现 Tabs 可以通过动态组件和 v-for 指令结合完成。定义一个 tabs 数组,包含每个标签的标题和对应的组件。…

vue实现triger

vue实现triger

在Vue中实现触发器(trigger)功能通常涉及自定义事件或DOM事件触发。以下是几种常见场景的实现方法: 自定义事件触发 通过$emit方法触发父组件中监听的自定义事件: // 子组件 thi…

vue router 实现

vue router 实现

Vue Router 的实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的核心实现方式。 安装 Vue Router 通…

vue怎么实现

vue怎么实现

Vue 实现方法 Vue 是一个流行的前端框架,用于构建用户界面。以下是几种常见的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。 <input v…

vue实现handsontable

vue实现handsontable

Vue 中实现 Handsontable 要在 Vue 项目中集成 Handsontable,可以使用官方提供的 @handsontable/vue 封装库。以下是一个完整的实现步骤。 安装依赖…