AngularJS 对跨域资源执行 OPTIONS HTTP 请求 => 错误 401

Posted

技术标签:

【中文标题】AngularJS 对跨域资源执行 OPTIONS HTTP 请求 => 错误 401【英文标题】:AngularJS performs an OPTIONS HTTP request for a cross-origin resource => error 401 【发布时间】:2015-02-14 13:15:37 【问题描述】:

我正在尝试使用 $resource 从 REST Web 服务获取数据。

这是我的代码:

    return $resource('http://serverURL', , 

                getQuartiers: 
                    method: 'GET',
                    headers:  
                             'Authorization': 'Basic base64login:pseudostring',
                     ,

                ,


          );

问题在于,对于这样的标头,它是一个发送的选项请求,我收到错误 401 Unauthorized。 如果我删除标题,这是一个 GET 请求。 但我需要标题来发送我的授权字符串!

否则 web 服务是好的,或者通过 chrome 直接进入 url => 带有 login/pwd 的弹出窗口 => json 格式的正确数据 或使用邮递员 chrome 扩展,它发送一个 GET 请求。

怎么了?

【问题讨论】:

您的标头请求似乎没问题,我在我的 web api 项目中使用了类似的东西。我的问题在于您的 Web 服务器,而不是您的 JS 代码。检查您的后端代码。 去看看 Cors。 w3.org/TR/cors。那是你的问题atm。它是获得 401 的预检。 由于使用带有 OPTION 请求的邮递员工作正常,我认为这不是服务器配置问题!? 【参考方案1】:

您似乎没有处理预检Options请求

您的 Web API 需要响应 Options 请求,以确认它确实配置为支持 CORS

要处理这个问题,您需要做的就是发回一个空响应

添加了这项额外检查以确保不会利用设计为仅接受 GETPOST 请求的旧 APIs。想象一下,当这个 verb 不存在时,向 API 发送一个 DELETE 请求。结果是不可预测的,结果可能是危险的

【讨论】:

我不确定...你在谈论服务器配置,不是吗?实际上服务器发送响应: Access-Control-Allow-Headers:Authorization Access-Control-Allow-Methods:GET Access-Control-Allow-Origin:* etc 但似乎我的标头未正确发送: 是的,那是在服务器端,API 配置。 使用邮递员,OPTION 请求标头有这一行: Authorization:Basic mystring 使用我的代码,而是:Access-Control-Request-Headers:accept, authorization 所以我认为我的标头没有正确发送!?

以上是关于AngularJS 对跨域资源执行 OPTIONS HTTP 请求 => 错误 401的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 对跨域资源执行 OPTIONS HTTP 请求 => 错误 401

跨域请求触发浏览器复杂请求

检测浏览器对跨域 XMLHttpRequests 的支持?

怎样避免跨域发出OPTIONS请求?

TryGetFormCredentials 对跨域请求返回 null

如何使用 Joomla 作为服务器配置跨域资源共享 (CORS)?