Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保护(ssl)nodejs/express web服务并使用$.ajax()跨域调用它_Ajax_Node.js_Ssl_Https_Express - Fatal编程技术网

保护(ssl)nodejs/express web服务并使用$.ajax()跨域调用它

保护(ssl)nodejs/express web服务并使用$.ajax()跨域调用它,ajax,node.js,ssl,https,express,Ajax,Node.js,Ssl,Https,Express,我设置了一个nodejs应用程序,如下所示: var express = require('./../../../Library/node_modules/express'); var https = require('https'); var app = express(); httpsOptions = { key: fs.readFileSync('privatekey.pem'), cert: fs.readFileSync('certificate.pem') //

我设置了一个nodejs应用程序,如下所示:

var express =   require('./../../../Library/node_modules/express'); 
var https = require('https');
var app = express();

httpsOptions = {
  key: fs.readFileSync('privatekey.pem'), 
  cert: fs.readFileSync('certificate.pem')  // SELF-SIGNED CERTIFICATE
}

var server = https.createServer(httpsOptions);
app.get('/myservice', function(req, res) {
...
}
server.listen(8443);
function testService(){
   var data =  { some JSON };

    $.ajax({
            url: 'https://myserver:8443/myservice',
            dataType: "jsonp",
            data: data,   
            jsonpCallback: "_mycallback",
            cache: false,
            timeout: 5000,
            success: function(data) {
                alert(data);
            },
            error: function(jqXHR, textStatus, errorThrown) {
                alert('Error: ' + textStatus + " " + errorThrown);
            }
        });
}
我已为入站请求打开服务器中的8443端口。 如果我打开
https://mydomain/myservice:8443
我从浏览器中收到不受信任的连接警告,这似乎是合乎逻辑的

然后从本地计算机上运行的test.html(用于测试跨域问题),我执行以下操作:

var express =   require('./../../../Library/node_modules/express'); 
var https = require('https');
var app = express();

httpsOptions = {
  key: fs.readFileSync('privatekey.pem'), 
  cert: fs.readFileSync('certificate.pem')  // SELF-SIGNED CERTIFICATE
}

var server = https.createServer(httpsOptions);
app.get('/myservice', function(req, res) {
...
}
server.listen(8443);
function testService(){
   var data =  { some JSON };

    $.ajax({
            url: 'https://myserver:8443/myservice',
            dataType: "jsonp",
            data: data,   
            jsonpCallback: "_mycallback",
            cache: false,
            timeout: 5000,
            success: function(data) {
                alert(data);
            },
            error: function(jqXHR, textStatus, errorThrown) {
                alert('Error: ' + textStatus + " " + errorThrown);
            }
        });
}
我的问题是这个请求超时了,我认为它甚至没有到达服务

  • 知道为什么吗

  • 每当我向服务器发出此请求时(希望感谢您的友好响应),浏览器警告不受信任的证书会发生什么情况?这会阻止
    $.ajax()
    以静默方式调用服务器并接收响应吗


  • 客户机的JSONP请求超时的原因实际上可能是任何原因。由于JSONP的工作方式,您只能知道请求是失败还是成功,而当请求失败时,总是因为超时。也就是说,如果您没有在客户端上保存服务器自签名证书,它几乎肯定会失败。为此,请确保告诉浏览器始终信任服务器的证书。在Firefox中,您还可以进入“首选项->加密->查看证书->您的证书->导入…”。。。将证书添加到Firefox。其他浏览器应该有类似的界面

    要解决潜在的跨域问题,请尝试将以下内容添加到您的
    app.get('/myservice')

    此外,不同的浏览器处理这些事情的方式也不同。根据我的经验,Firefox有时比Chrome更为宽松,但我肯定会在这两个方面进行测试

    为了测试HTTPS问题,首先我将尝试只设置一个常规的expressjs服务器(无加密),而不在您的请求中使用HTTPS://。如果请求成功,您就知道问题出在SSL上。如果是这样,请确保当浏览器发出安全警告时,您启用了允许您将该站点永久添加到受信任主机的任何选项

    此外,我认为这一行:

    var server = https.createServer(httpsOptions);
    
    应该是:

    var server = https.createServer(httpsOptions, app);
    
    (发件人:)

    您可能还希望在下面添加以下代码
    var server=https.createServer(httpsOptions)用于调试(以便您可以轻松查看服务器是否接收到请求):


    希望这有帮助

    对不起,伙计们,我应该早点回来。实际上,我改变了执行此操作的方式,而不是来自客户端的JSONP调用,现在我正在执行来自服务器的HTTP请求。然而,为了总结这篇文章,我们可以得出这样一个结论:Mike,您的意思是,当使用JSONP和SSL时,客户端必须始终安装证书?谢谢,再次为迟到道歉。