访问控制不接受 Angular $resource 调用允许 Safari 与 Chrome 接受

Posted

技术标签:

【中文标题】访问控制不接受 Angular $resource 调用允许 Safari 与 Chrome 接受【英文标题】:Angular $resource calls not accepted by Access Control Allow with Safari vs. accepted with Chrome 【发布时间】:2013-12-26 20:51:20 【问题描述】:

我在这方面有点卡住了,因为我是 Angular 和 Web 开发的新手,所以不知道该去哪里找。

我已经构建了一个简单的服务,它使用 Angular 中的 $resource 服务调用设置为接受跨域调用的 RESTapi:

angular.module('vinifyApp')
.factory('WinesVinibar',function($resource)
return $resource('http://devinify1.herokuapp.com/wines/');    
)
.controller('GetWinesVinibarCtrl', function($scope, WinesVinibar)
$scope.WINES = WinesVinibar.query();

我已经在本地和 heroku 上测试了这项服务,它在 Chrome 和 Firefox 上运行良好。以下是 Chrome 的请求和响应:

要求 接受:*/* 接受编码:gzip、deflate、sdch 接受语言:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 连接:保持活动 主机:devinify1.herokuapp.com 来源:http://mobilevinify.herokuapp.com 参考:http://mobilevinify.herokuapp.com/ 用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/31.0.1650.63 Safari/537.36 响应标头view source 访问控制允许来源:* 允许:GET、POST、HEAD、OPTIONS 连接:保持活动 内容类型:应用程序/json 日期:2013 年 12 月 9 日星期一 16:16:36 GMT 服务器:gunicorn/18.0 传输编码:分块 变化:接受,Cookie

但是,请求因 Safari 而失败,并出现以下错误:

[错误] 加载资源失败:Access-Control-Allow-Headers 不允许请求头字段 Accept-Encoding。 (葡萄酒,第 0 行)

以下是请求和响应标头:

要求 访问控制请求方法 GET 用户代理 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit/537.71 (KHTML, like Gecko) 版本/7.0 Safari/537.71 Access-Control-Request-Headers 接受语言、来源、接受编码 回复 访问控制最大年龄 86400 访问控制允许方法 GET、POST、PUT、PATCH、DELETE、OPTIONS 内容类型文本/html;字符集=utf-8 访问控制允许来源 * 连接保持活动 Access-Control-Allow-Headers x-requested-with、content-type、accept、origin、authorization、x-csrftoken 内容长度 0

编码似乎有问题,但我不知道去哪里解决这个问题。 感谢您的宝贵时间!

【问题讨论】:

【参考方案1】:

您似乎遗漏了 CORS_ALLOW_HEADERS 设置中的一些参数:

Request:
Access-Control-Request-Headers  accept-language, origin, accept-encoding

Response:
Access-Control-Allow-Headers    x-requested-with, content-type, accept, origin, authorization, x-csrftoken

尝试在您的 settings.py 中的标题中添加接受语言和接受编码

CORS_ALLOW_HEADERS = (
'x-requested-with',
'content-type',
'accept',
'origin',
'authorization',
'x-csrftoken',
'accept-encoding',
'accept-language'

)

【讨论】:

以上是关于访问控制不接受 Angular $resource 调用允许 Safari 与 Chrome 接受的主要内容,如果未能解决你的问题,请参考以下文章

即使 Rails 服务器配置为接受所有请求,Angular 发布请求也未通过预检

使用 Angular $resource 上传文件

如何使用 Angular $resource 发送 x-www-form-urlencoded 数据?

RBAC权限控制项目

没有“访问控制允许来源”Angular 4 应用程序

Angular $resource 服务以表单数据而不是请求有效负载发送数据