【问题标题】:How to handle CORS error code?如何处理 CORS 错误代码?
【发布时间】:2014-12-28 23:23:15
【问题描述】:

编辑:我刚刚意识到这是Recommended solution for AJAX, CORS, Chrome & HTTP error codes (401,403,404,500) 的副本,他尝试了我最后提出的想法。但我不知道他是否成功了(笨蛋用户?),没有其他人发布解决方案甚至评论,所以我认为值得寻找新的答案。

问题:

  • 我发送了一个正确执行的(编辑:IMproperly-executed。故事结束...)CORS 请求。
  • 服务器收到请求并尝试处理它。
  • 服务器返回错误响应,例如422 Unprocessable Entity,以及有关错误的 JSON 信息。这个想法是我的应用可以接收此错误信息并在 UI 中适当地处理它。
  • 浏览器阻止我的错误处理程序获取响应内容,甚至获取状态码。

显示浏览器收到401 状态码,但将其视为 CORS 安全错误:

响应对象,显示我的代码无法访问响应数据(data: ""status: 0):

其他人是如何处理这个限制的?我现在最好的猜测是劫持 HTTP “成功”代码 (2XX) 作为错误代码,然后在响应中包含错误信息。这使我无法以正常方式使用 ajax 错误处理程序,但我还是将其作为全局 ajax 过滤器处理,因此此过滤器将捕获异常成功代码并触发错误处理程序。

【问题讨论】:

  • 那个链接确实有另一个答案,顺便说一句。我不知道您是在尝试修复错误还是只是捕获它。

标签: javascript ajax http cors


【解决方案1】:

控制台消息表明服务器在发送 401 响应代码时未发送所需的 Access-Control-Allow-Origin 标头。

除非您修复该问题,否则您将无法使用 CORS 错误处理程序将内容注入 DOM。

服务器很可能在响应代码为 200 的响应中正确发送标头。但是,如果您希望使用来自这些响应代码的数据,则需要对其他响应代码执行此操作。

在客户端做出设计妥协之前,先在服务器端修复该问题。这可能会立即解决您的问题。

【讨论】:

  • 我说这是一个正确执行的 CORS 请求。当服务器响应成功代码时,浏览器会正确处理它。
  • 服务器成功发送必要的标头。它也需要在失败时发送它们。
  • 换句话说,如果您希望使用来自 200 以外的响应代码的 JSON 数据,则需要在 200 以外的响应代码上发送 CORS 标头。
【解决方案2】:

这似乎是一个不透明的响应,您无法获取标头或响应。并且所有内容都设置为 null 或为空。

https://developer.mozilla.org/en-US/docs/Web/API/Response/type

或者也许你应该在服务器中添加:

Access-Control-Allow-Origin: *

【讨论】:

    【解决方案3】:

    答案很晚,但如果有人想检查在发送XMLHttpRequest 时是否发生错误,然后采取适当的措施(在客户端),那么这是一个快速的解决方法:

    try{
        request.send();
    }catch(err){
        if(e.toString().startsWith("NetworkError")){
            //pasre the string to check error code
            //and take appropriate actions
        }
    }
    

    这是必需的,因为onreadystatechange 函数不会在NetworkError 发生时执行,实际上整个脚本已终止。

    【讨论】:

    • 这是特定于 CORS 还是任何 XHR?
    • @colllin 我不确定,但任何在控制台中显示NetworkError 的东西都可以通过这种方式处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多