当前位置:首页 > 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

登录逻辑实现

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

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):

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. 前端应定期检查令牌有效期

注销处理

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

vue实现jwt登录

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

标签: vuejwt
分享给朋友:

相关文章

vue 实现在线预览

vue 实现在线预览

Vue 实现在线预览的常见方法 使用 iframe 嵌入 通过 iframe 标签可以嵌入多种类型的文件,如 PDF、图片、网页等。需要确保文件地址可访问。 <template> &…

vue实现store

vue实现store

Vue 实现 Store 在 Vue 中,可以通过 Vuex 或 Pinia 实现全局状态管理(Store)。以下是两种主流方案的实现方法。 使用 Vuex 实现 Store Vuex 是 Vue…

vue交互实现

vue交互实现

Vue 交互实现方法 Vue.js 提供了多种方式实现用户交互,包括事件处理、表单绑定、动态渲染等。以下是常见的交互实现方法: 事件处理 通过 v-on 或 @ 指令绑定事件,触发方法或直接执行表达…

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue实现handsontable

vue实现handsontable

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

vue实现试卷

vue实现试卷

Vue实现试卷系统的基本思路 使用Vue.js构建试卷系统需要结合组件化开发、状态管理和后端数据交互。核心功能包括题目展示、答题逻辑、计时器和提交答案。 核心功能模块划分 试卷组件结构 试卷容器组…