我试图检测XMLHttpRequest()由于交叉原始错误而不是错误请求而失败.例如:
ajaxObj=new XMLHttpRequest()
ajaxObj.open("GET", url, true);
ajaxObj.send(null);
Run Code Online (Sandbox Code Playgroud)
考虑4个网址案例:
情况1: url是正确设置access-control-allow-origin的有效地址
http://192.168.8.35我Access-Control-Allow-Origin: *在标头中设置了一个服务器情况2: url是现有服务器上的无效地址
http://xyz.google.com服务器响应的位置,但它不是有效请求情况3: url是一个不存在的服务器IP地址
http://192.168.8.6在我的本地网络上没有任何响应案例4: URL是一个有效的地址在访问控制允许来源是不设置
http://192.168.8.247我在标头中没有 Access-Control-Allow-Origin: *设置的服务器问题是:如何区分案例4(访问控制允许来源错误)和案例2和3?
在案例4中,Chrome调试控制台显示错误:
XMLHttpRequest cannot load http://192.168.8.247/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.
如何在Javascript中识别该错误?
我试图找到一些迹象,ajaxObj但与案例2和3相比似乎没有什么不同.
这是我使用的简单测试:
<!DOCTYPE html PUBLIC "-//W3C//DTD …Run Code Online (Sandbox Code Playgroud) 有没有办法捕获由于Access-Control-Allow-Origin提出请求而导致的错误?我正在使用jQuery,并且.ajaxError()永远不会调用处理程序集,因为请求永远不会开始.
有没有解决方法?
CORS规范没有说明服务器应如何响应无效的CORS请求.例如,如果请求Origin无效,则CORS规范声明:"终止这组步骤.请求超出了本规范的范围." 其他错误情况也有类似的语言,例如请求无效的方法或标头.
在CORS错误的情况下,预期的响应应该是什么?我知道不同的服务器可能需要不同的行为.但我正在寻找标准响应或响应,如果服务器所有者不在乎可以接受.
当身份验证(JWT)成功时,我在本地开发环境中使用CORS.我的客户端页面运行localhost并调用api.mycompany.com获取数据.我的api项目检查有效的JWT,如果通过,则返回内容.我花了一段时间才到这里,但这一切都很好.
如果我没有发送有效的JWT,则api会正确响应401(在Fiddler中检查),但客户端上的错误函数回调报告错误代码为0且状态为"错误".
我希望ajax回调函数检查错误的状态代码,如果是401,请检查标题名为location的标题(将包含uri到身份验证服务).
(API项目)在本地IIS Express上运行MVC4项目的Visual Studio 2012实例
http://localhost:8080http://api.mycompany.com:8080在站点下的applicationhost.config中:
<site name="StuffManagerAPI" id="1">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\Users\me\Documents\Visual Studio 2012\Projects\StuffManagerAPI\StuffManagerAPI" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:8080:localhost" />
<binding protocol="http" bindingInformation="*:8080:api.mycompany.com" />
</bindings>
</site>
Run Code Online (Sandbox Code Playgroud)(客户端项目)将Visual Studio实例与ASP.net空Web应用程序分开
http://localhost:22628使用Google Chrome作为测试客户端
使用Fiddler查看流量
我认为这些应该是我的概念验证中的重要部分.再次,CORS预检和数据检索都可以正常工作.这只是未经授权的案例无效.如果您还有其他需要,请告诉我.谢谢您的帮助.
授权标题处理程序
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using …Run Code Online (Sandbox Code Playgroud) 我正在使用AngularJS,但我遇到了与JQuery相同的问题,并且在JavaScript中也是如此.如果我访问的远程服务器设置了Access-Control-Allow-Origin,则调用success或error方法.
当没有Access-Control-Allow-Origin时,这些都没有被调用,我只能在控制台中看到错误.有没有办法捕获No Access-Control-Allow-Origin我的JavaScript代码中的
错误?
如果您对用例感兴趣,我正在构建PyPi的前端https://pypi.python.org/在那里,您可以获得有关JSON格式的包的信息.(例如https://pypi.python.org/pypi/dspy/json).这些请求设置了Access-Control-Allow-Origin,但是如果我发送一个不在服务器上的包的请求(例如 https://pypi.python.org/pypi/dspyz/json),那么我得到No Access -Control-Allow-Origin因此我的JavaScript代码中没有调用任何内容.
更新
经过一些实验后,我发现该error方法被调用它只是因为我使用的代码存在一些问题并且误导我而引发异常.
假设某个特定用户正在使用 Chrome,并且在 Chrome 的控制台中记录了一个运行时错误。我想知道那个错误是什么。目前,我必须联系特定用户,让他们打开控制台并告诉我错误是什么(或发送屏幕截图)。
有没有办法让我自动捕获或记录该错误(无论错误是什么)并将其发送到服务器?
作为后续问题,有没有办法为所有主要浏览器执行此操作?
使用Fetch API时,我试图捕获与同一原始策略相关的许多错误,但未成功:
window.onerror = (message, file, line, col, error) => console.log(error)
window.addEventListener('error', (error) => console.log(error))
try {
fetch('https://www.bitstamp.net/api/ticker/').catch(e => {
console.log('Caugth error:')
console.log(e)
console.log(JSON.stringify(e))
})
}
catch (e) {
console.log('try-catch')
console.log(e)
}
Run Code Online (Sandbox Code Playgroud)
我要捕获的错误仅出现在Web控制台中:
在此处查看代码示例:https : //github.com/nyg/fetch-error-test
如何捕获这些错误以提供屏幕消息?
编辑:实际执行获取的catch块。
window.onerror = (message, file, line, col, error) => console.log(error)
window.addEventListener('error', (error) => console.log(error))
try {
fetch('https://www.bitstamp.net/api/ticker/').catch(e => {
console.log('Caugth error:')
console.log(e)
console.log(JSON.stringify(e))
})
}
catch (e) {
console.log('try-catch')
console.log(e)
}
Run Code Online (Sandbox Code Playgroud)
fetch('https://www.bitstamp.net/api/ticker/')
.then(response => response.text())
.then(pre)
.catch(e => {
pre(`Caugth error: …Run Code Online (Sandbox Code Playgroud)cors ×5
javascript ×5
jquery ×3
ajax ×2
angularjs ×1
cross-domain ×1
fetch-api ×1
frontend ×1
json ×1