SORU
25 HAZİRAN 2015, PERŞEMBE


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.
    }
});

enter image description here

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
14 Temmuz 2015, Salı


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.

Source

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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cartoonium

    Cartoonium

    11 NİSAN 2011
  • Codecourse

    Codecourse

    3 ŞUBAT 2009
  • fast2hell

    fast2hell

    16 AĞUSTOS 2006