跨域访问控制校验失败(无HTTP成功状态)本地调用解决方案咨询
解决CORS错误:doesn't pass access control check: It does not have HTTP ok status
核心问题拆解
你踩了个CORS常见坑:把本该由服务器返回的跨域响应头,错误加到了前端请求里。Access-Control-Allow-*这类头是服务器用来告诉浏览器“允许这个跨域请求”的凭证,前端请求时加这些完全无效,反而可能干扰预检请求的正常处理。
另外错误提示明确说明请求没有返回HTTP OK状态(200-299区间),大概率是你的请求(包括浏览器自动发的OPTIONS预检请求)被服务器返回了4xx/5xx状态码,导致浏览器的跨域检查直接失败。
具体修复步骤
1. 清理前端请求里的无效头
修改你的AJAX代码,删掉所有Access-Control-*开头的请求头,同时修正success里的错误代码(result是服务器返回的数据,不是响应对象,根本没有setHeader方法):
$.ajax({ method: "POST", url: host + "/fgerp-ms-2.0.0/oauth/token?grant_type=password&username=fgapiuser&password=fgapiuser", async: true, crossDomain: true, beforeSend: function (xhr) { // 只保留必要的授权头和跨域凭证设置 xhr.setRequestHeader("Authorization", "Basic " + btoa("fgapiservice" + ":" + "fg@1234$")); xhr.withCredentials = true; }, success: function (result) { alert("in success" + result.access_token); accesstoken = result.access_token; }, // 加上错误回调,方便排查具体HTTP状态 error: function(xhr, status, error) { console.log("HTTP状态码:", xhr.status); console.log("错误详情:", error); } });
2. 配置服务器端的CORS规则(关键)
跨域权限完全由服务器控制,必须确保服务器满足以下要求:
- 处理OPTIONS预检请求:必须返回200 OK状态,同时返回正确的响应头:
Access-Control-Allow-Origin: 设置为你的本地前端域名(比如http://localhost:8080,注意开启withCredentials=true时不能用*)Access-Control-Allow-Methods: 要包含POST, OPTIONSAccess-Control-Allow-Headers: 必须包含Authorization(你的请求带了这个头)Access-Control-Allow-Credentials: 设置为true
- 处理实际的POST请求:同样要返回上述CORS响应头,并且确保请求本身返回200 OK(比如核对用户名密码、授权头是否正确,避免返回401/403)
3. 用浏览器工具排查请求细节
打开浏览器开发者工具的网络面板,查看请求记录:
- 先看OPTIONS预检请求的状态码,如果是401/403,说明服务器没配置允许OPTIONS请求跳过授权验证
- 再看POST请求的状态码,如果是401,说明你的
Authorization头或者用户名密码有误,需要核对参数正确性
内容的提问来源于stack exchange,提问作者syam
相关产品推荐
相关产品推荐

