当前位置: 首页 > 面试题库 >

确定ajax调用是否由于响应不安全或连接被拒绝而失败

乜飞航
2023-03-14
问题内容

我一直在做很多研究,找不到解决这个问题的方法。我正在尝试执行从https服务器到运行带有自定义自签名证书的码头的locahosthttps服务器的jQueryajax调用。我的问题是我无法确定响应是连接被拒绝还是响应不安全(由于缺少证书接受)。有没有办法确定两种情况之间的差异?的responseText,并且statusCode总是在这两种情况下是相同的,即使在Chrome控制台我可以看到一个区别:

net::ERR_INSECURE_RESPONSE
net::ERR_CONNECTION_REFUSED

responseText``statusCode对于这两种情况,始终为“”,始终为“ 0”。

我的问题是,如何确定jQuery
ajax调用是由于ERR_INSECURE_RESPONSE还是由于失败ERR_CONNECTION_REFUSED

一旦证书被接受,一切工作正常,但是我想知道本地主机服务器是否已关闭,或者它已启动并正在运行,但是证书尚未被接受。

$.ajax({
    type: 'GET',
    url: "https://localhost/custom/server/",
    dataType: "json",
    async: true,
    success: function (response) {
        //do something
    },
    error: function (xhr, textStatus, errorThrown) {
        console.log(xhr, textStatus, errorThrown); //always the same for refused and insecure responses.
    }
});

在此处输入图片说明

即使手动执行请求,我也会得到相同的结果:

var request = new XMLHttpRequest();
request.open('GET', "https://localhost/custom/server/", true);
request.onload = function () {
    console.log(request.responseText);
};
request.onerror = function () {
    console.log(request.responseText);
};
request.send();

问题答案:

无法将其与最新的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 world\n");
}).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 world\n");
}).listen(8000);

为了使其正常工作,您需要安装Nodejs,需要为每个服务器生成单独的证书,并将其分别存储在certs和certs2文件夹中。

运行它只是执行node applicationServer.jsnode targetServer.js在终端(ubuntu的例子)。



 类似资料:
  • 在尝试创建到运行在不同服务器上的rabbitmq的新连接时,我得到了以下错误: null 命令PID用户FD类型设备大小/关闭节点名称 beam.smp 3084 rabbitmq 15u IPv6 18611 0T0 TCP*:AMQP(侦听) rabbitmqctl列表连接 tcp 0 0:::5672:::*侦听3084/beam.smp

  • 我尝试使用Virtualbox在MacOS上运行minikube v0.22.1和kubectl v1.7.5。 但是,所有命令都失败并显示“连接被拒绝-您指定了正确的主机或端口吗?” 此处提出的解决方案(< code > sudo ifconfig vboxnet0 up )没有帮助,vbox net 0接口已启动。 我们非常感谢您的任何想法或建议。

  • 我使用Java连接MySQL和Json将数据发送到android,当我通过URL地址将数据从Java发送到Json时: 一切都很好,但是当我在Android中解析数据时,我收到了一个错误结果,如下所示: logcat: (192.168.1.221)IP地址是我的PC机,如果我从192.168.1.221更改为本地主机,我仍然会收到相同的错误。

  • 我正在运行一个非常基本的Javamail程序来尝试发送电子邮件。这是带有main()的独立程序。一旦我让它工作,我计划在tomcat下运行的servlet中使用Javamail。 运行此程序时,我收到身份验证登录失败错误。我尝试了几种不同的属性设置,但都没有解决问题。 然后我在SO上找到一篇帖子,建议降低我谷歌账户的安全级别。当我降低安全设置时,身份验证成功。 当然,我立即回到了谷歌账户的更高安全

  • 问题内容: 我正在尝试使用PHP连接来连接phpmyadmin上的MySQL数据库。只是尝试查看连接是否成功,对连接没有什么幻想。我正在使用MAMP托管数据库,我尝试使用的连接是这样的: 我一直在使用邮递员进行测试,以查看连接是否正常工作,但是我一直收到以下错误消息: 连接失败:SQLSTATE [HY000] [2002]连接被拒绝 在收到以下错误消息之前: 连接失败:SQLSTATE [HY0

  • 问题内容: 我是 HBase 和 Hadoop的 新手。我已经完全设置了HBase并完美启动。现在,当我尝试使用Java客户端从 p1 连接到HBase(HBase安装在 p2上 )时,它抛出了一个奇怪的异常。 问题答案: 我找到了解决方案。 通过仅从我的 主机中 删除 localhost 条目。现在我的本地主机条目就像 192.169.19.50 [这是我的hbase IP] =本地主机,而不是