无法将其与最新的Web浏览器区分开。
W3C规格:
以下步骤描述了用户代理对于简单的跨域请求必须执行的 *** 作 :
应用发出请求的步骤,并在发出请求时遵守下面的请求规则。
如果未设置手动重定向标志,并且响应的HTTP状态代码为301、302、303、307或308,请 执行重定向步骤。
如果最终用户取消请求,请 应用中止步骤。
如果存在网络错误
如果发生DNS错误,TLS协商失败或其他类型的网络错误,请应用网络错误步骤。不要请求任何类型的最终用户交互。注意:这不包括指示某种错误类型的HTTP响应,例如HTTP状态代码410。
否则,请 执行资源共享检查。如果返回失败,请应用网络错误步骤。否则,如果返回通过,则终止此算法并将跨域请求状态设置为成功。实际不终止请求。
如您所见,网络错误不包括包含错误的HTTP响应,这就是为什么您总是得到0作为状态代码,而总是得到“”作为错误的原因。
资源
注意 :以下示例是使用Google Chrome版本43.0.2357.130并针对我创建的用于模拟OP
one的环境制作的。设置代码位于答案的底部。
我虽然是一个办法要解决这将是使通过HTTP的二次请求,而不是HTTPS作为这个答案,但我记得那是不可能的,因为浏览器的较新版本阻止混合内容。
这意味着,如果您使用的是HTTPS,则Web浏览器将不允许通过HTTP发出请求,反之亦然。
几年前就一直这样,但是较旧的Web浏览器版本(如Mozilla Firefox)低于其版本23。
证据:
从HTTPS usign Web Broser控制台发出HTTP请求
var request = new XMLHttpRequest();request.open('GET', "http://localhost:8001", true);request.onload = function () { console.log(request.responseText);};request.onerror = function () { console.log(request.responseText);};request.send();
将导致以下错误:
混合内容:“ https:// localhost:8000 /
”上的页面已通过HTTPS加载,但请求了不安全的XMLHttpRequest端点“ http:// localhost:8001
/ ”。该请求已被阻止;内容必须通过HTTPS提供。
如果您尝试通过其他方式(例如添加iframe)来执行此 *** 作,则浏览器控制台中会出现相同的错误。
<iframe src="http://localhost:8001"></iframe>
还使用Socket连接作为答,我很确定结果是相同/相似的,但是我已经尝试了。
尝试使用HTTPS打开从Web Broswer到非安全套接字端点的套接字连接,将导致混合内容错误。
new WebSocket("ws://localhost:8001", "protocolone");
1)混合内容:“ https:// localhost:8000 /
”上的页面已通过HTTPS加载,但是试图连接到不安全的WebSocket端点“ ws:// localhost:8001
/”。该请求已被阻止;该端点必须在WSS上可用。2)未捕获的DOMException:无法构造“ WebSocket”:可能无法从通过HTTPS加载的页面启动不安全的WebSocket连接。
然后,我也尝试连接到wss端点,请参阅是否可以阅读有关网络连接错误的一些信息:
var exampleSocket = new WebSocket("wss://localhost:8001", "protocolone");exampleSocket.onerror = function(e) { console.log(e);}
在服务器关闭的情况下执行上述代码段会导致:
WebSocket与’wss:// localhost:8001 /’的连接失败:连接建立错误:net ::
ERR_CONNECTION_REFUSED
在服务器开启的情况下执行上述代码段
WebSocket与“ wss:// localhost:8001 /”的连接失败:WebSocket打开握手已取消
但是同样,“ onerror函数”输出到控制台的错误没有任何技巧可以区分一个错误和另一个错误。
使用代理作为此答案建议可能有效,但前提是“目标”服务器具有公共访问权限。
这里不是这种情况,因此在这种情况下尝试实现代理将导致我们遇到相同的问题。
创建Node.js HTTPS服务器的代码 :
我创建了两个使用自签名证书的Nodejs HTTPS服务器:
targetServer.js:
var https = require('https');var fs = require('fs');var options = { key: fs.readFileSync('./certs2/key.pem'), cert: fs.readFileSync('./certs2/key-cert.pem')};https.createServer(options, function (req, res) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); res.writeHead(200); res.end("hello worldn");}).listen(8001);
applicationServer.js:
var https = require('https');var fs = require('fs');var options = { key: fs.readFileSync('./certs/key.pem'), cert: fs.readFileSync('./certs/key-cert.pem')};https.createServer(options, function (req, res) { res.writeHead(200); res.end("hello worldn");}).listen(8000);
为了使其正常工作,您需要安装Nodejs,需要为每个服务器生成单独的证书,并将其分别存储在certs和certs2文件夹中。
运行它只是执行
node applicationServer.js和
node targetServer.js在终端(ubuntu的例子)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)