- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我做了很多研究,但找不到处理这个问题的方法。我正在尝试执行从 https 服务器到运行带有自定义自签名证书的码头的 locahost https 服务器的 jQuery ajax 调用。我的问题是我无法确定响应是拒绝连接还是不安全响应(由于缺少证书接受)。有没有办法确定这两种情况之间的区别? 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 规范:
The steps below describe what user agents must do for a simple cross-origin request:
Apply the make a request steps and observe the request rules below while making the request.
If the manual redirect flag is unset and the response has an HTTP status code of 301, 302, 303, 307, or 308 Apply the redirect steps.
If the end user cancels the request Apply the abort steps.
If there is a network error In case of DNS errors, TLS negotiation failure, or other type of network errors, apply the network error steps. Do not request any kind of end user interaction.
Note: This does not include HTTP responses that indicate some type of error, such as HTTP status code 410.
Otherwise Perform a resource sharing check. If it returns fail, apply the network error steps. Otherwise, if it returns pass, terminate this algorithm and set the cross-origin request status to success. Do not actually terminate the request.
如您所见,网络错误不包括包含错误的 HTTP 响应,这就是为什么您将始终获得 0 作为状态代码,而“”作为错误。
注意:以下示例是使用 Google Chrome 版本 43.0.2357.130 和我创建的用于模拟 OP one 的环境制作的。设置它的代码在答案的底部。
我认为解决此问题的方法是通过 HTTP 而不是 HTTPS 发出二次请求 This answer但我记得这是不可能的,因为较新版本的浏览器会阻止混合内容。
这意味着如果您使用 HTTPS,Web 浏览器将不允许通过 HTTP 请求,反之亦然。
从几年前开始就是这样,但较旧的 Web 浏览器版本(例如低于其版本 23 的 Mozilla Firefox)允许这样做。
关于它的证据:
从 HTTPS 使用 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();
会导致以下错误:
Mixed Content: The page at 'https://localhost:8000/' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://localhost:8001/'. This request has been blocked; the content must be served over HTTPS.
如果您尝试以添加 Iframe 的其他方式执行此操作,浏览器控制台中将出现相同的错误。
<iframe src="http://localhost:8001"></iframe>
使用Socket连接也是Posted as an answer ,我很确定结果会相同/相似,但我试过了。
尝试使用 HTTPS 打开从 Web Broswer 到非安全套接字端点的套接字连接将导致混合内容错误。
new WebSocket("ws://localhost:8001", "protocolOne");
1) Mixed Content: The page at 'https://localhost:8000/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://localhost:8001/'. This request has been blocked; this endpoint must be available over WSS.
2) Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
然后我尝试连接到 wss 端点,看看是否可以阅读有关网络连接错误的一些信息:
var exampleSocket = new WebSocket("wss://localhost:8001", "protocolOne");
exampleSocket.onerror = function(e) {
console.log(e);
}
在关闭服务器的情况下执行上面的代码片段会导致:
WebSocket connection to 'wss://localhost:8001/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
在服务器打开的情况下执行上面的代码片段
WebSocket connection to 'wss://localhost:8001/' failed: WebSocket opening handshake was canceled
但同样,“onerror function”输出到控制台的错误没有任何提示来区分一个错误和另一个错误。
使用代理作为 this answer suggest可以工作,但前提是“目标”服务器具有公共(public)访问权限。
这里不是这种情况,因此尝试在这种情况下实现代理将导致我们遇到同样的问题。
创建 Node.js HTTPS 服务器的代码:
我创建了两个使用自签名证书的 Nodejs HTTPS 服务器:
目标服务器.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);
应用服务器.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 中。
要运行它,只需在终端(ubuntu 示例)中执行 node applicationServer.js
和 node targetServer.js
。
关于javascript - 确定 ajax 调用是否由于不安全的响应或连接被拒绝而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31058764/
有人有 Comet 应用程序 .net 的任何样本吗? 我需要一个示例如何在服务器中保持客户端的连接? 最佳答案 这里也有一些不错的: http://www.frozenmountain.com/we
我想知道是否有 Yii2 专家可以帮助我了解如何最好地使用 ajax 表单与 Yii ajax 验证相结合。我想我可以在不带您阅读我所有代码的情况下解释这个问题。 我正在处理一个促销代码输入表单,用户
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
f:ajax 和 a4j:ajax 标记之间有什么显着差异吗? 我知道 Richfaces 4 中的 a4j:ajax 基于 native f:ajax JSF2 标记,添加了一些 f:ajax 中未
我已经尝试过这样但无法获取数组列表。它返回“null” var data=[]; data[0] = '1'; data[1] = '2'; $.ajax({
在教程中可以看到 jQuery.ajax 和 $.ajax 喜欢这里 http://www.thekludge.com/form-auto-save-with-jquery-serialize/ jQ
过度使用 AJAX 会影响性能吗?在大型 Web 应用程序的上下文中,您如何处理 AJAX 请求以控制异步请求? 最佳答案 过度使用任何东西都会降低性能;在必要时使用 AJAX 将提高性能,特别是如果
似乎我无法使用 Ext.Ajax.request 进行跨域 ajax 调用。看起来 ScriptTag: True 没有任何效果。 这是我的代码: {
我正在使用 Bottle 微框架(但我怀疑我的问题来自它) 首先,如果我定义了一个从/test_redirect 到/x 的简单重定向,它会起作用。所以 Bottle redirect() 在简单的情
任何人都可以指出各种 AJAX 库的统一比较吗?我已经阅读了大约十几种不同的书,我即将开始一个项目,但我对自己是否已经探索了可能性的空间没有信心。 请注意,我不是在要求“我认为 XXX 很棒”——我正
似乎使用 AJAX 的站点和应用程序正在迅速增长。使用 AJAX 的主要原因之一可能是增强用户体验。我担心的是,仅仅因为项目可以使用 AJAX,并不意味着它应该。 可能是为了 UX,AJAX 向站点/
假设我有一个可以通过 Javascript 自定义的“报告”页面。假设我有可以更改的 start_date、end_date 和类型(“简单”或“完整”)。现在 我希望地址栏始终包含当前(自定义) V
我一直在阅读 Ajax 并且希望从 stackoverflow 社区看到我是否正确理解所有内容。 因此,正常的客户端服务器交互是用户在 url 中拉出 Web 浏览器类型,并将 HTTP 请求发送到服
这可能有点牵强,但让我们假设我们需要它以这种方式工作: 我在服务器的 web 根目录中有一个 index.html 文件。该文件中的 javascript 需要向/secure/ajax.php 发出
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 去年关闭。 Improve this
我希望ajax post成功进入主页。由于某种原因,我一直做错事。知道我应该做什么来解决这个问题吗? window.APP_ROOT_URL = ""; Ajax $.ajax({ url: '#{a
我在 2 个不同的函数中有 2 个 ajax 调用。我想用.click来调用这2个函数。 func1 将数据插入数据库,然后 func2 检索数据,所以我的问题是如何等到 func1 完全完成然后只执
我试图在单击按钮后禁用该按钮。我尝试过: $("#ajaxStart").click(function() { $("#ajaxStart").attr("disabled", true);
我试图在每个 Ajax 请求上显示加载动画/微调器 我的 application.js $(document).on("turbolinks:load", function() { window.
我正在显示使用jQplot监视数据的图形。 为了刷新保存该图的div,我每5秒调用一次ajax调用(请参见下面的JavaScript摘录)。 在服务器上,PHP脚本从数据库中检索数据。 成功后,将在5
我是一名优秀的程序员,十分优秀!