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

使用AJAX调用Web服务时二次请求报401未授权的原因排查

解决AJAX二次请求401 Unauthorized的问题

嘿,这种情况我碰到过好几次!既然同一个令牌在Postman和Python里跑的好好的,那问题绝对出在浏览器端的AJAX配置上,和令牌本身没关系,咱们一步步捋:

1. 先检查Authorization头的格式

你第一次POST拿到令牌后,第二次请求有没有把令牌正确放到请求头里?通常认证令牌都是用Authorization: Bearer <你的令牌>这个格式,别犯低级错误——比如少了Bearer或者它后面的空格,或者令牌前后多了引号/空格。

给你个标准的AJAX示例,对照着改:

// 假设你把拿到的令牌存在了token变量里
const token = "你的认证令牌内容";
$.ajax({
  url: "你第二次请求的接口URL",
  type: "GET", // 换成你实际需要的请求方法,比如POST
  headers: {
    "Authorization": `Bearer ${token}`, // 重点!格式必须和Postman完全一致
    // 如果接口要求Content-Type,也别忘了加上
    "Content-Type": "application/json"
  },
  success: res => console.log(res),
  error: xhr => console.log(`错误:${xhr.status}`, xhr.responseText)
});

怕格式错?直接打开Postman的「Code」选项卡,生成jQuery AJAX的代码,和你自己的代码对比,哪里不一样改哪里就行。

2. 跨域请求一定要开凭证携带

你说禁用Chrome的CORS扩展就出跨域错误,说明这是个跨域请求。浏览器的AJAX在跨域时,默认是不会携带任何凭证的(比如Cookie、认证相关的隐含信息),哪怕你加了Authorization头,可能服务端还需要其他凭证,或者你的AJAX没开允许携带的开关。

给AJAX加上这两行配置:

$.ajax({
  // 其他配置不变
  xhrFields: {
    withCredentials: true // 关键:允许跨域请求携带凭证
  },
  crossDomain: true // 明确标记这是跨域请求
});

为啥Postman没问题?因为Postman根本不受浏览器的CORS策略限制,默认就会处理所有凭证,而浏览器里的AJAX必须显式开启这个开关才行。

3. 确认令牌没被意外篡改

有时候第一次拿到令牌后,存储或者传递时可能被改了——比如用localStorage存的时候不小心多加了空格,或者打印出来的令牌和Postman里的不一样。

你可以在第二次请求前先console.log(token),把打印出来的内容复制到Postman里测试,如果Postman能用,那令牌绝对没问题,还是AJAX的配置问题。

4. (可选)检查服务端的CORS配置

如果前面几步都试了还是不行,那可能是服务端的CORS配置不全——比如它只设置了Access-Control-Allow-Origin,但没允许Authorization这个请求头。这时候服务端需要在响应头里加上:

Access-Control-Allow-Headers: Authorization, Content-Type

不过你用CORS扩展的话,可能扩展已经帮你绕过了这个限制,但如果要彻底解决跨域问题,还是得让服务端把CORS配置补全。


总结一下,90%的概率是Authorization头格式错了或者跨域没开凭证携带,先从这两点入手排查,肯定能解决问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:11:02