【问题标题】:Can't manage to make CORS request working无法使 CORS 请求正常工作
【发布时间】:2015-09-16 03:59:39
【问题描述】:

我正在尝试从不同域的 Web 服务获取一些数据,但遇到了一些 CORS 问题。

我的控制器中有这样的东西:

$http({method: 'GET', url : 'http://somewebserviceapi.com?idAppli=' + appId, headers: {'Authorization': 'Basic dXNlcm5hbWU6cGFzc3dvcmQ='}}).
        success(function(data, status, headers, config) {
            console.log(data);
        }).
        error(function() {
            console.log("An error occured");
        });

我收到以下错误:

选项 http://somewebserviceapi.com?idLangue=1&idAppli=2153 b @ angular.js:9866n @ angular.js:9667$get.f @ angular.js:9383(匿名函数) @ angular.js:13248$get.n.$eval @ angular. js:14466$get.n.$digest @ angular.js:14282$get.n.$apply @ angular.js:14571showApplication @ viewerController.js:825handleApplications @ svgManipulation.js:15SvgPanZoom.handleMouseUp @ svg-pan-zoom。 js:1195SvgPanZoom.setupHandlers.eventListeners.mouseup@svg-pan-zoom.js:829

XMLHttpRequest 无法加载 http://somewebserviceapi.com?idLangue=1&idAppli=2153 。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:63342' 不允许访问。响应的 HTTP 状态代码为 401。

现在是标题:

当它被我的控制器调用时:(似乎没有进行身份验证)

(响应)

Connection: Keep-Alive
Content-Length: 0
Date: Mon, 29 Jun 2015 14:33:09 GMT
Keep-Alive: timeout=5, max=100
Server: Apache
WWW-Authenticate: Negotiate
                  Basic realm="AD-ITS.SOME-COMPANY.COM"

(请求)

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Access-Control-Request-Headers: authorization
Access-Control-Request-Methods: GET
Connection: keep-alive
Host: somewebserviceapi.com
Origin: http://localhost:63342
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0

当我自己去网址时:

(响应)

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Origin, Accept, Authorization
Access-Control-Allow-Methods: GET, POST, DELETE, PUT
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Length: 394
Content-Type: application/json;charset=UTF-8
Date: Mon, 29 Jun 2015 15:21:08 GMT
Keep-Alive: timeout=5, max=99
Server: Apache

(请求)

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Connection: keep-alive
Cookie: JSESSIONID=89C1EC542BCBC42421C6207767EF8FA1
Host:  http://somewebserviceapi.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0

在 Chrome 上,除了响应和请求标头之外,还有一个可见的通用标头: 在这个标题中,我有:

来自我的控制器请求:Request Method:OPTIONS

当我自己访问 URL 时:Request Method:GET

显然,OPTIONS 方法是 CORS 处理某些事情的方式,但我需要在某处添加 OPTIONS 方法吗?

服务器端,我确实有Access-Control-Allow-Origin: * 行,所以我不知道如何解决这个问题。

【问题讨论】:

  • 使用项目目录中的python -m SimpleHTTPServer 从命令行启动服务器。或者只是在 Stack Overflow 上找到任何一个答案......似乎每天都会问同样的问题。
  • 很遗憾,我手头没有服务器,我要求添加CORS支持,已经添加了,但可能还缺少一些东西。
  • 使用此命令启动 your 应用程序。您正在 ping 的服务器正在做正确的事情。
  • 好吧,我不熟悉 Python,我什至没有安装它(顺便说一句,我在 Windows 上)。但是我也尝试使用http-server -a localhost 在http-server 上运行该应用程序并通过http://localhost:8080/ 访问它,我有同样的错误,使用的方法仍然是OPTIONS

标签: javascript html ajax angularjs cors


【解决方案1】:

这是典型的 CORS 问题,当您从 JS 进行调用并应用 CORS 逻辑时,将进行的第一个调用是 OPTIONS 应该返回

200 OK 响应为空(不确定它是否真的必须为空)

和标题:

Access-Control-Allow-Methods: GET, POST, DELETE, PUT Access-Control-Allow-Origin: *

OPTIONS 正确配置后,如果可以在Access-Control-Allow-Methods: GET, POST, DELETE, PUT 中找到该方法,则会进行另一个调用

虽然OPTIONS必须添加到Access-Control-Allow-Methods

【讨论】:

  • OPTIONS 应该如何配置?如果我将OPTIONS 添加到Access-Control-Allow-Methods,将使用正确的GET 方法进行第二次调用,是吗?
  • 正确,OPTIONS 可以确认可以使用哪些方法,即您只希望在某些 api 端点上使用 DELETE 方法,然后任何其他尝试都将失败。因此,只需将OPTIONS 添加到允许的方法并配置服务器以使用success 响应这些调用
【解决方案2】:

这似乎与预检请求(OPTIONS 请求)有关。请看一下这个SO问题Why does the preflight OPTIONS request of an authenticated CORS request work in Chrome but not Firefox?

如何让 OPTIONS 请求以一致的方式发送和响应?

只需让服务器(本例中为 API)响应 OPTIONS 无需身份验证即可请求。

Kinvey 在扩展这方面做得很好,同时也链接到了一个问题 Twitter API 概述了这个确切的 catch-22 问题 有趣的是,在任何浏览器问题出现前几周 已归档。

看看它是否适合你。 (另外,由于这似乎也是与浏览器相关的问题,请检查不同的浏览器,看看会发生什么)

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 2014-11-03
    • 2014-04-21
    • 2017-04-06
    • 2018-07-13
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多