axios请求拦截后请求头没变化是怎么回事?
在用axios设置请求拦截时,给config.headers赋值token后,发现发送出去的请求头里并没有这个字段,控制台也没报错,这是为什么呢?
我按照文档写了拦截器:
axios.interceptors.request.use(config => {
const token = localStorage.getItem('token');
config.headers.Authorization = <code>Bearer ${token}</code>;
console.log('拦截到请求:', config.headers); // 这里能正常打印出带token的header
return config;
});
但实际发送请求时,通过浏览器开发者工具看network请求头,Authorization字段就是没有。难道是拦截器执行顺序有问题?或者我哪里没return?
首先确认一点:你是不是用了
axios.create()创建了一个新的实例?如果用了,那必须给这个实例加拦截器,而不是直接用axios.interceptors。比如:如果你还是用
axios.get()发请求,那根本不会走你给自定义实例加的拦截器,自然header也就不会变。还有一种可能是你在设置headers之前,已经有其他地方设置了同名header但被覆盖了。通用的做法是在拦截器里统一处理,并且确保返回config。
另外别忘了判断token是否存在,不然可能拼出
Bearer null这种无效值。最后检查下浏览器network面板里的实际请求,看是不是发出了预检请求(OPTIONS),如果是跨域,要后端允许Authorization字段,否则就算前端设置了也会被浏览器拦掉。
说白了就三件事:用对实例、发对请求、后端配对字段。先从实例和调用方式查起,八成是这里搞混了。
axios.interceptors.request.use写在了路由守卫或者组件 mounted 之后才执行,这时候可能已经发过请求了。确保你的拦截器是在 axios 实例创建后、任何请求发出前就注册好。比如在 request.js 或者 api 配置文件里初始化完 axios 就立刻注册拦截器。
另外一个小概率问题是 headers 的覆盖问题。有些情况下你后续又 new 了一个 axios 实例但没加拦截器,或者是用了默认实例和自定义实例混用。建议统一用一个封装好的实例:
然后你所有请求都用这个 service 实例发,就不会丢 header 了。
最后检查下浏览器控制台 Network 里的预检请求(OPTIONS),如果你的 Authorization 字段没带过去,可能是 CORS 问题导致浏览器根本没发这个头。后端处理跨域时要确认允许 Authorization 字段,比如 Node.js Express 加个:
res.header('Access-Control-Allow-Headers', 'Authorization, Content-Type')先确定是不是拦截器生效时机 + 实例统一 + 跨域白名单这三个点,八成是其中之一的问题。