如何处理 CORS 错误代码?
Posted
技术标签:
【中文标题】如何处理 CORS 错误代码?【英文标题】:How to handle CORS error code? 【发布时间】: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 过滤器处理,因此此过滤器将捕获异常成功代码并触发错误处理程序。
【问题讨论】:
那个链接确实有另一个答案,顺便说一句。我不知道您是在尝试修复错误还是只是捕获它。 【参考方案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
的东西都可以通过这种方式处理。以上是关于如何处理 CORS 错误代码?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 Spring Boot、AngularJS 应用程序中的 CORS 错误?
如何处理 spring security + angular 中的 401 错误?