Eğer ajax çağrısı nedeniyle tepki güvensiz başarısız olmadığını belirlemek veya bağlantı reddedildi
Çok araştırma yaptım ve bunu halletmenin bir yolunu bulamadı. Locahost https sunucusu özel bir kendinden imzalı sertifika ile iskele çalışan bir https sunucu jQuery ajax arama gerçekleştirmek için çalışıyorum. Benim sorunum yanıt bir bağlantı reddedildi olup olmadığını belirlemek ya da güvensiz bir yanıt () sertifika kabul olmaması nedeniyle yapamayacağım. Bir şekilde her iki senaryo arasındaki farkı belirlemek için var mı? ** 9, statusCode
krom konsol farkı görebiliyorum olsa bile, her iki durumda da aynıdır:
net::ERR_INSECURE_RESPONSE
net::ERR_CONNECTION_REFUSED
responseText
her zaman "" ve statusCode
her zaman "0" her iki durumda da.
Benim soru, nasıl olursa jQuery ajax çağrısı 14 ** ve ERR_CONNECTION_REFUSED
nedeniyle başarısız olup olmadığını belirlemek.
Sertifika kabul ettiğinde her şey gayet iyi çalışıyor ama localhost sunucuyu kapatın, ya da yukarı ve çalışan ama belgesi henüz kabul edilmemiş olup olmadığını bilmek istiyorum.
$.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.
}
});
Hatta elle aynı sonucu alırım isteğini gerçekleştirmek:
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();
CEVAP
Not:Benzer bir ortam sentezledim. Eğer birileri bazı testler yapılmasını ve akla gelen bazı fikirleri denemek istiyorsanız, bu kodu cevap dibinde, hayır, bunu yapmak zorunda.
İlgili soru:
Biraz araştırma daha sonra bunu buldum:
Tarayıcıdan ayırmak için bir yol yoktur
W3C Spec göre
Aşağıdaki adımlar, kullanıcı arayüzleri yapması gereken, çapraz menşe basit bir istek için tarif:
Bu bir istek adımlar ve istek yaparken aşağıda istek kuralları uygulanır.
Manuel yönlendirme bayrağı Geri Al yanıtta, 301, 302, 303, 307, 308 veya HTTP durum kodu varsa Yönlendirme adımları uygulamak.
Eğer son kullanıcı isteği iptal eder İptal adımları uygulamak.
Bir ağ hatası varsa Ağ hataları hataları, TLS anlaşması yetmezliği, ya da diğer tür DNS halinde, network error steps uygulayın. Son kullanıcı etkileşimi her türlü talep etmiyor.
Not: Bu hata, bir tür gösteren bir HTTP yanıt, HTTP durum kodu 410 gibi içermez.
Aksi takdirde Kaynak paylaşımı denetimi yapmak. Eğer başarısız dönerse, ağ hatası adımları uygulamak. Eğer pas verir aksi takdirde, bu algoritmayı Sonlandır ve çapraz menşe isteği başarı durumunu belirlemek. Aslında istek sonlandırmaz.
Sizin de görebildiğiniz gibi, ağ hataları hataları vardır, her zaman durum kodu olarak 0 alacak bu yüzden HTTP yanıtı içermez, ve "" bir hata gibi.
Deliller Ve Testler:
Ben gördüğüm zaman bu yazı ilk defa sanırım böyle bir yaklaşım olabilir yapmak için bir ikincil isteği üzerine, HTTP, HTTPS gibi @Schultzie sivri onun cevabı hatırladı ama bu mümkün değil çünkü daha yeni sürümleri tarayıcıları blok karışık içerik (cant var HTTP ve HTTPS aynı anda), bu yüzden bu yaklaşım işe yarayabilir, ama sadece kullanıyorsanız eski tarayıcı gibi Mozilla Firefox altında sürüm 23.
eğer https://localhost:8000 krom Sürüm 43.0.2357.130 kullanmaya devam edersen, bahsedilen örnekte ortamı Kullanarak test etmek için
Ve bu kod son konsol
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();
aşağıdaki hata neden:
Karışık İçerik: sayfa 'https://localhost:8000/' HTTPS üzerinden yüklendi, ama güvensiz bir XMLHttpRequest son nokta istenen 'http://localhost:8001/'. Bu isteği engellendi; içeriği HTTPS üzerinden sunulması gerekir.
Eğer bir İframe kullanmaya çalıştığınızda, aynı hata almalısınız
<iframe src="http://localhost:8001"></iframe>
Yani, atılan HTTPS üzerinden HTTP.
Yuva içinde düşünüyorum da ama aynı sonucu içinde biteceğini, ama bir cevap olarak gönderilmiş çünkü ben zor sonra, ben denedim. Ama, bir kez daha, karışık içerik yasak
Krom konsol yapıştırma
new WebSocket("ws://localhost:8001", "protocolOne");
aynı soruna işaret ediyor: iki hata
1) Karışık İçerik: sayfa 'https://localhost:8000/' HTTPS üzerinden yüklendi, ama güvensiz WebSocket bitiş noktasına bağlanma girişimi'://localhost:8001/ ws'. Bu isteği engellendi; bu son nokta OKUYORDUM üzerinden kullanılabilir olması gerekir.
2) Object Yakalanmamış: oluşturmak için Başarısız oldu'': güvensiz WebSocket bağlantısı bir sayfa HTTPS üzerinden yüklü başlatılan olmayabilir. WebSocket
Sonra kullanarak öyle konsolda bu yapıştırma bağlanmayı denedim
var exampleSocket = new WebSocket("wss://localhost:8001", "protocolOne");
exampleSocket.onerror = function(e) {
console.log(e);
}
Ancak bu tarayıcı hataları değişti:
Server kapalı:
Bağlantı WebSocket'://localhost:8001/ öyle bir hata oluştu: bağlantı kurma: Hata::ERR_CONNECTION_REFUSED net
Sunucu:
WebSocket'://: 8001/ el sıkışma iptal edildi WebSocket.' başarısız oldu: öyle localhost bağlantısı
Ama yine bu hata "" konsol başka bir hata ayırt etmek için herhangi bir ipucu var değil çıktı. onerror işlev
Olası çözüm:
Kullanarak bir proxy olarak @artur grzesiak cevap işe yarayabilir ama yalnızca "hedef" sunucusu olan kamu erişimi zor olan bir durum söz konusu değildir burada, o yüzden tek yolu uygulamak için bir proxy bu durumda kullanarak bir uygulama var erişmek için "localhost", tek yönlü test olabilir klonlama "hedef Sunucu" yapma isteği "klonlanmış" sunucu "hedef sunucu" ve doğrulama yanıtı sunucu tarafında, ama "klonlanmış" sunucu (proxy) ve aynı sorunlara yol açar. sertifikaları kabul etmeliyiz
Hakkında kod ortamı çoğaltmak için:
Kendi kendine imzalanmış sertifika sunucuları, HTTPS iki node.js yarattım
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);
İş yapmak için node.js Yüklü olması gerekir, ayrılmış sertifikaları oluşturmak için Gereken her sunucu form ve klasörleri sertifikaları ve certs2 buna göre içinde saklayın. Bundan sonra node applicationServer.js
terminali node targetServer.js
gibi çalıştırın.
Nasıl değişken olup olmadığını belirle...
Nasıl belirli bir Linux 32 bit veya 64...
Hızlı eğer bir tam sayı iki tamsayı (d...
Nasıl bir web sayfası doğrudan tarayıc...
Eğer bir çift (veya yüzer) NaN olup ol...