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

登录后更新Vue中Axios基础实例的API Token

解决Axios实例登录后更新Token的问题

嘿,完全理解,刚上手第一个Vue项目遇到这类基础问题太正常啦,不用不好意思😉

你现在的核心问题是:Axios实例在初始化时就把当时localStorage里的token(登录前大概率是空值或旧值)塞进了Authorization头,登录后虽然新token存进了localStorage,但实例的请求头并没有自动同步更新。这里给你两种实用的解决思路:

方法一:直接更新Axios实例的默认headers

这种方式简单直接,适合场景单一的情况。在登录成功拿到新token后,保存到localStorage的同时,手动修改API实例的默认请求头:

// 登录接口的成功回调逻辑
async function handleLogin() {
  const loginRes = await API.post('/login', { username, password });
  const newToken = loginRes.data.token;
  
  // 保存token到本地存储
  localStorage.setItem('api_token', newToken);
  // 直接更新Axios实例的Authorization头
  API.defaults.headers.Authorization = `Bearer ${newToken}`;
}

方法二:使用请求拦截器(更推荐)

这是更健壮的长期方案——通过添加请求拦截器,让每次发起请求前自动从localStorage获取最新的token并注入请求头。不管是登录成功后,还是后续token过期刷新,都不用手动维护实例的headers,一劳永逸。

修改你的Axios实例代码如下:

import axios from 'axios'
import router from '@/router'

export const API = axios.create({
  baseURL: 'http://api-url.com',
  validateStatus: function (status) {
    if (status === 401) {
      router.push('/login');
    }
    // 注意:validateStatus需要返回布尔值,原代码return status是错误的
    // 这里表示仅接受200-299区间的状态码为成功响应,可根据业务需求调整
    return status >= 200 && status < 300;
  }
})

// 添加请求拦截器,每次请求前自动注入最新token
API.interceptors.request.use(
  function(config) {
    const latestToken = localStorage.getItem('api_token');
    if (latestToken) {
      config.headers.Authorization = `Bearer ${latestToken}`;
    }
    return config;
  },
  function(error) {
    // 请求出错时的处理逻辑
    return Promise.reject(error);
  }
);

额外小提醒:修正validateStatus的逻辑

你原来的validateStatus函数里return status是不符合要求的——这个函数需要返回布尔值,用来告知Axios该状态码是否应该被判定为成功响应。上面的代码已经帮你修正了这个问题,你可以根据自身业务场景调整判断规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:09:46