You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js & Vuex:在Store中存储AccessToken并实现登录后跳转

没问题,我帮你梳理一下在Vuex中存储AccessToken、实现登录跳转的完整流程,都是实际项目里常用的写法,很容易落地👇

实现Vuex存储Token+登录跳转的完整步骤

1. 配置Vuex的Store入口(index.js)

首先在src/store/index.js里创建store实例,定义好需要存储的state字段,同时引入我们要写的mutations:

import { createStore } from 'vuex'
import mutations from './mutations'

export default createStore({
  state: {
    // 存储用户的access token
    accessToken: '',
    // 存储refresh token对应的时间戳,用来判断是否需要刷新token
    refreshTimestamp: 0
  },
  mutations,
  // 如果需要异步操作(比如登录请求),可以加actions,这里先聚焦核心逻辑
  actions: {},
  modules: {}
})

2. 编写Mutations(mutations.js)

在src/store/mutations.js里创建修改state的mutation方法,要遵循Vuex的规范——只能通过mutation修改state:

export default {
  // 设置access token
  SET_ACCESS_TOKEN(state, token) {
    state.accessToken = token
  },
  // 设置refresh token的时间戳
  SET_REFRESH_TIMESTAMP(state, timestamp) {
    state.refreshTimestamp = timestamp
  }
}

3. Test.vue中的登录按钮逻辑

在你的登录组件Test.vue里,绑定点击事件,处理登录请求,成功后调用Vuex的mutation设置token和时间戳,最后跳转到指定页面:

<template>
  <div class="login-container">
    <!-- 假设这里有账号密码输入框 -->
    <input v-model="username" placeholder="用户名" />
    <input v-model="password" type="password" placeholder="密码" />
    <button @click="handleLogin">登录</button>
  </div>
</template>

<script>
export default {
  name: 'Test',
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    async handleLogin() {
      try {
        // 1. 调用后端登录接口,获取token和刷新时间戳
        const loginRes = await this.$axios.post('/api/login', {
          username: this.username,
          password: this.password
        })
        const { accessToken, refreshExpire } = loginRes.data

        // 2. 通过Vuex的commit调用mutation设置state
        this.$store.commit('SET_ACCESS_TOKEN', accessToken)
        // 这里假设refreshExpire是过期时间戳,直接存进去;如果是过期时长,就计算当前时间+时长
        this.$store.commit('SET_REFRESH_TIMESTAMP', refreshExpire)

        // 3. 跳转到指定页面,比如首页或者用户之前访问的页面
        // 如果是固定跳转首页:
        this.$router.push('/home')
        // 如果要跳转到用户登录前的目标页面,可以从路由的query里取:
        // const redirect = this.$route.query.redirect || '/home'
        // this.$router.push(redirect)
      } catch (error) {
        // 处理登录失败的情况,比如提示用户账号密码错误
        console.error('登录失败:', error)
        this.$message.error('账号或密码错误,请重试')
      }
    }
  }
}
</script>

4. 实用的额外建议

  • Token持久化:如果希望页面刷新后token不丢失,可以在mutation里把token同时存在localStorage里,然后在store的初始化钩子(或App.vue的created)里从localStorage读取并恢复state:
    // 在mutations的SET_ACCESS_TOKEN里加一行
    localStorage.setItem('accessToken', token)
    // 在store的index.js里添加初始化逻辑(Vue3可在setup中处理)
    export default createStore({
      // ...其他配置
      state: { /* ... */ },
      mutations,
      actions: {
        initToken({ commit }) {
          const savedToken = localStorage.getItem('accessToken')
          if (savedToken) {
            commit('SET_ACCESS_TOKEN', savedToken)
          }
        }
      },
      // Vue2中可在store实例创建后调用,Vue3可在App.vue的onMounted中调用store.dispatch('initToken')
    })
    
  • 路由守卫验证:可以在路由的全局前置守卫里检查accessToken,未登录的用户跳转到登录页,同时记录当前页面作为跳转目标:
    // src/router/index.js
    import store from '@/store'
    
    router.beforeEach((to, from, next) => {
      const accessToken = store.state.accessToken
      // 给需要登录的路由配置meta.requireAuth: true
      if (to.meta.requireAuth && !accessToken) {
        next({ path: '/login', query: { redirect: to.fullPath } })
      } else {
        next()
      }
    })
    

内容的提问来源于stack exchange,提问作者Aadil Hafesji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:18:52