Axios实例GET请求未携带Authorization头,POST请求正常问题排查
解决Axios GET请求不携带Bearer令牌的问题
可能的原因及对应解决方案
1. 确认Axios实例的Authorization头是否真的生效
在GET请求执行前,打印Axios实例的默认头,排查token是否正确设置:
console.log(apiClient.defaults.headers.common);
如果输出中Authorization是Bearer undefined,说明你的token获取逻辑有问题,导致头无效,浏览器会自动忽略这个格式错误的头。
2. 检查请求拦截器是否篡改了GET请求的头
如果你的Axios实例配置了请求拦截器,排查是否有针对GET请求移除Authorization头的代码:
// 检查拦截器里的逻辑 apiClient.interceptors.request.use(config => { // 警惕这种针对GET请求删除头的代码 if (config.method === 'get') { // delete config.headers.Authorization; } return config; });
3. 浏览器缓存导致旧请求被复用
浏览器会缓存GET请求,如果之前的请求没有带Authorization头,后续可能直接读取缓存,不会发送新请求。可以通过两种方式验证:
- 在浏览器开发者工具的「网络」面板勾选禁用缓存,重新发起请求
- 给GET请求添加随机参数,强制浏览器发送新请求:
apiClient.get(`posts/${router.query.id}/`, { params: { _: Date.now() } });
4. Django后端CORS配置限制
如果使用django-cors-headers,确保配置允许Authorization头:
# settings.py CORS_ALLOW_HEADERS = [ # 其他允许的头 'authorization', ] # 如果你的请求需要携带凭证(比如cookie),还需要开启: CORS_ALLOW_CREDENTIALS = True
如果后端没有允许Authorization头,浏览器可能会在跨域GET请求中自动省略这个头。
5. 显式给GET请求设置头(兜底方案)
如果以上方法都无效,直接在GET请求中显式指定headers,绕过默认头的问题:
apiClient.get(`posts/${router.query.id}/`, { headers: { 'Authorization': `Bearer ${token}` } });
关于OPTIONS请求的说明
POST前的OPTIONS是浏览器自动发送的预检请求,用于确认后端允许自定义头和POST方法。这个预检请求本身不会携带Authorization头,但只要预检通过,后续的POST请求就会正常携带令牌。这和GET请求不带头没有直接关联——GET请求如果属于「简单请求」(比如没有自定义头、Content-Type为application/x-www-form-urlencoded等),不会触发预检,会直接发送请求。
内容的提问来源于stack exchange,提问作者kirill ras
相关产品推荐
相关产品推荐

