Google Chrome 65 CORS问题:AngularJS 1.6.9项目POST/PUT请求失效求助
针对AngularJS 1.6.9在Chrome 65+下POST/PUT请求失效的解决方案
我之前在维护老项目时刚好碰到过几乎一模一样的问题,结合你的场景,大概率是Chrome 65版本开始对CORS规则、请求头处理的严格执行导致的,给你几个具体的排查和解决方向:
1. 优先检查CORS预检请求(OPTIONS)的响应
Chrome 65对跨域预检请求的要求大幅提升,只要你的POST/PUT请求带了自定义头、或者Content-Type不是application/x-www-form-urlencoded/multipart/form-data/text/plain这三类,浏览器就会先发送OPTIONS请求验证权限:
- 打开Chrome DevTools的Network面板,筛选
OPTIONS请求,查看它的响应状态码(必须是200)和响应头:- 必须包含
Access-Control-Allow-Origin(匹配你的前端域名) - 必须包含
Access-Control-Allow-Methods,且里面要明确列出POST、PUT - 如果你的请求带了自定义头(比如
Authorization),Access-Control-Allow-Headers里必须包含这个头
- 必须包含
- 如果OPTIONS请求失败,后续的POST/PUT会直接被浏览器拦截,这是最常见的原因。
2. 修复AngularJS $http的请求序列化问题
AngularJS 1.6.x默认给POST/PUT请求设置的Content-Type是application/json,但部分服务器在Chrome 65后对JSON格式的解析逻辑出现兼容性问题,你可以尝试强制切换为表单编码格式:
单个请求修改
$http.put('/api/records/' + recordId, $.param(updatedData), { headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8' } }) .then(function(res) { // 处理成功逻辑 }) .catch(function(err) { console.log('PUT请求错误详情:', err); });
全局配置修改(所有请求生效)
angular.module('yourAppName') .config(['$httpProvider', function($httpProvider) { // 覆盖默认POST/PUT的Content-Type $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; // 添加数据序列化器,把JSON对象转成表单格式 $httpProvider.defaults.transformRequest = [function(data) { return angular.isObject(data) && String(data) !== '[object File]' ? $.param(data) : data; }]; }]);
3. 检查SameSite Cookie政策影响
Chrome 65开始推行SameSite Cookie的默认限制,如果你的API请求依赖Cookie做身份验证,且是跨域场景:
- 要确保后端设置Cookie时加上
SameSite=None; Secure属性(注意Secure要求必须是HTTPS环境) - 如果是同域场景,也可以检查是否Cookie的SameSite设置为
Strict导致请求无法携带
4. 升级AngularJS补丁版本
AngularJS 1.6.9确实存在和Chrome 65+的兼容性小问题,官方在后续的1.6.10及以上补丁版本中修复了部分浏览器适配问题,你可以尝试升级到同大版本的最新补丁包,成本很低但可能直接解决问题。
另外,如果你能补充完整PUT请求的错误信息(比如Console里的报错提示、Network面板里的请求失败原因),可以更精准地定位问题。
内容的提问来源于stack exchange,提问作者slee423
相关产品推荐
相关产品推荐

