AngularJS跨域CORS报错:预检请求未通过访问控制检查
核心结论
这个跨域问题必须由服务器端解决,AngularJS客户端无法直接绕过浏览器的CORS限制。
为什么你的客户端代码无效
你在请求头里添加的Access-Control-Allow-Origin、Access-Control-Allow-Credentials等头完全是多余的——这些头是服务器返回给浏览器的响应头,用来告诉浏览器“允许这个跨域请求”,而不是客户端发请求时需要携带的。浏览器根本不会读取请求里的这些头,自然也不会以此判断跨域是否合法。
报错的具体原因
你的POST请求设置了Content-Type: application/json,这属于非简单请求(简单请求的Content-Type只能是application/x-www-form-urlencoded、multipart/form-data或text/plain)。对于非简单请求,浏览器会先发送一个OPTIONS预检请求到目标服务器,询问是否允许该跨域请求。
如果目标服务器没有在OPTIONS响应中返回正确的CORS头(比如缺少Access-Control-Allow-Origin),浏览器就会拦截后续的POST请求,并抛出你看到的报错。
客户端能做的调整
先把请求里多余的CORS头删掉,保留必要的Content-Type即可:
self.generateSession = function (bodyData) { const headers = { 'Content-Type': 'application/json' }; return $http.post('https://www.other-domain.com', bodyData, { headers: headers }); };
但这只是修正代码冗余,无法解决跨域问题——真正的解决需要服务器端配合:
- 让目标服务器(
other-domain.com)配置CORS响应头,至少要返回Access-Control-Allow-Origin(可以设为你的域名或*,不需要携带Cookie的话); - 确保服务器能正确处理OPTIONS预检请求,返回包含
Access-Control-Allow-Methods(包含POST)、Access-Control-Allow-Headers(包含Content-Type)的响应头。
临时绕方案(仅开发环境)
如果暂时无法修改目标服务器,可以在本地搭建一个代理服务器,将请求转发到目标域名。比如用Node.js写个简单的代理,或者利用AngularJS的开发代理配置,让浏览器认为请求是同域的,从而绕过CORS检查。但这个方案只适合开发调试,生产环境还是必须服务器端配置CORS。
内容的提问来源于stack exchange,提问作者iiiasminx

