当前位置:首页 > VUE

vue实现登录保存token

2026-02-20 16:58:31VUE

使用Vue实现登录保存Token的方法

本地存储Token

登录成功后,将Token保存到本地存储(localStorage或sessionStorage)。localStorage持久化存储,sessionStorage会话期间有效。

localStorage.setItem('token', response.data.token);

Vuex状态管理

在Vuex中定义Token状态,通过mutation更新Token,便于全局访问和管理。

// store.js
const store = new Vuex.Store({
  state: {
    token: null
  },
  mutations: {
    setToken(state, token) {
      state.token = token;
      localStorage.setItem('token', token);
    },
    clearToken(state) {
      state.token = null;
      localStorage.removeItem('token');
    }
  }
});

请求拦截器

在axios请求拦截器中,将Token添加到请求头中,实现自动携带Token。

vue实现登录保存token

axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
}, error => {
  return Promise.reject(error);
});

响应拦截器

在axios响应拦截器中,处理Token过期或无效的情况,跳转到登录页。

axios.interceptors.response.use(response => {
  return response;
}, error => {
  if (error.response.status === 401) {
    store.commit('clearToken');
    router.push('/login');
  }
  return Promise.reject(error);
});

路由守卫

在Vue Router中使用全局前置守卫,验证Token是否存在,保护需要登录才能访问的路由。

vue实现登录保存token

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

登录逻辑

在登录组件中,调用登录接口,成功后保存Token并跳转到首页。

methods: {
  async login() {
    try {
      const response = await axios.post('/api/login', this.form);
      this.$store.commit('setToken', response.data.token);
      this.$router.push('/');
    } catch (error) {
      console.error(error);
    }
  }
}

登出逻辑

在登出方法中清除Token,并跳转到登录页。

methods: {
  logout() {
    this.$store.commit('clearToken');
    this.$router.push('/login');
  }
}

Token刷新

对于有刷新Token需求的场景,可以在响应拦截器中检测Token过期,自动调用刷新Token接口。

axios.interceptors.response.use(response => {
  return response;
}, async error => {
  const originalRequest = error.config;
  if (error.response.status === 401 && !originalRequest._retry) {
    originalRequest._retry = true;
    const refreshToken = localStorage.getItem('refreshToken');
    const response = await axios.post('/api/refresh', { refreshToken });
    localStorage.setItem('token', response.data.token);
    return axios(originalRequest);
  }
  return Promise.reject(error);
});

标签: vuetoken
分享给朋友:

相关文章

vue 指令实现

vue 指令实现

Vue 指令实现 Vue 指令是 Vue.js 提供的特殊属性,用于在 DOM 元素上添加特殊行为。指令以 v- 前缀开头,例如 v-model、v-if、v-for 等。以下是实现自定义指令和常用内…

vue实现drag

vue实现drag

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 来完成。以下是两种常见方法的实现方式。 使用 HTML5 拖拽…

vue实现toast

vue实现toast

Vue 实现 Toast 的方法 使用第三方库(推荐) 对于快速实现 Toast 功能,推荐使用成熟的第三方库如 vue-toastification 或 vant 的 Toast 组件。 安装 v…

vue实现答题

vue实现答题

Vue 实现答题功能 数据结构设计 使用 Vue 的响应式特性管理题目和答案数据。通常需要以下数据结构: data() { return { questions: [ {…

vue nexttick 实现

vue nexttick 实现

Vue nextTick 实现原理 Vue 的 nextTick 是一个用于在下次 DOM 更新循环结束之后执行延迟回调的方法。它主要用于确保在 DOM 更新完成后执行某些操作。 核心实现机制 ne…

vue toast实现

vue toast实现

Vue Toast 实现方法 使用第三方库(推荐) 安装 vue-toastification 库,这是一个功能丰富且轻量级的 Vue Toast 插件。 npm install vue-toast…