2011-12-02 7 views
11

विजुअल सी ++ 2008 एसपी 1 के साथ विंडोज 7 पर क्यूटी एसडीके 1.1.4 का क्लीन इंस्टॉल; मैं क्यूटी निर्माता का उपयोग कर रहा हूँ। यह कोड कुछ वेब पेज क्यों लोड नहीं करता है?क्यूवेब व्यू/क्यूटी वेबकिट कुछ एसएसएल पेज नहीं खोलेंगे; रीडायरेक्ट की अनुमति नहीं है?

#include <QtGui/QApplication> 
#include <QtWebKit/QWebView> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QWebView b; 
    b.load(QUrl("https://gmail.com")); // doesn't work 
    //b.load(QUrl("https://accounts.google.com")); // works 
    //b.load(QUrl("https://google.com")); // doesn't work 
    //b.load(QUrl("https://www.google.com")); // works 
    b.show(); 

    return a.exec(); 
} 

कुछ यूआरएल क्यों काम नहीं करते हैं, और अन्य करते हैं?

मुझे लगता है कि google.com/www.google.com विशेष रूप से बता रहा है; google.com सामान्य रूप से www.google.com पर रीडायरेक्ट करता है। और gmail.com accounts.google.com पर रीडायरेक्ट कर रहा है। क्या वेबकिट सुरक्षित पृष्ठों को रीडायरेक्ट करने की इजाजत नहीं दे रहा है? यदि हां, तो इसे कैसे ठीक करें?

वैसे, क्यूटी एसडीके 1.1.4 में ओपनएसएसएल शामिल है; मैंने सी: \ QtSDK \ डेस्कटॉप \ Qt \ 4.7.4 \ msvc2008 \ bin \ ssleay32.dll पर इसकी उपस्थिति देखी। यह भी ध्यान दें कि कुछ पृष्ठ काम करने लगते हैं, बस दूसरों को नहीं।

संपादित करें: दो और यूआरएल:

b.load(QUrl("https://support.motionview3d.com/help/_media/images/directory.png")); // doesn't work 
b.load(QUrl("https://mail.google.com")); // works 

फिर, अन्य वेब ब्राउज़र में इन काम ठीक से दोनों।

उत्तर

16

आपको शायद एसएसएल त्रुटियां मिल रही हैं जिन्हें आप स्लॉट में संभाल सकते हैं। हालांकि सबसे अच्छा अंतिम समाधान नहीं है, आप स्लॉट का उपयोग सभी एसएसएल त्रुटियों को अनदेखा करने के लिए कर सकते हैं।

qwebview.h:

#ifndef WEBVIEW_H 
#define WEBVIEW_H 

#include <QWebView> 

class WebView : public QWebView 
{ 
    Q_OBJECT 

    public: 
     WebView(QWidget *parent = 0); 
    private slots: 
     void handleSslErrors(QNetworkReply* reply, const QList<QSslError> &errors); 
}; 

#endif // WEBVIEW_H 

qwebview.cpp:

#include "webview.h" 
#include <QNetworkReply> 
#include <QtDebug> 
#include <QSslError> 

WebView::WebView(QWidget *parent) : 
    QWebView(parent) 
{ 
    load(QUrl("https://gmail.com")); 

    connect(page()->networkAccessManager(), 
      SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError> &)), 
      this, 
      SLOT(handleSslErrors(QNetworkReply*, const QList<QSslError> &))); 
} 

void WebView::handleSslErrors(QNetworkReply* reply, const QList<QSslError> &errors) 
{ 
    qDebug() << "handleSslErrors: "; 
    foreach (QSslError e, errors) 
    { 
     qDebug() << "ssl error: " << e; 
    } 

    reply->ignoreSslErrors(); 
} 

main.cpp "

#include <QApplication> 
#include "WebView.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    WebView w; 
    w.show(); 
    return a.exec(); 
} 
मैं QWebView उपवर्गीकरण द्वारा ऐसा किया

चल रहा है इस इस तरह डिबग आउटपुट उत्पादन करना चाहिए:

handleSslErrors: 
ssl error: "The host name did not match any of the valid hosts for this certificate" 
ssl error: "No error" 
ssl error: "No error" 
... 

अपने अंतिम कार्यक्रम में, आप निश्चित रूप से SSL त्रुटियाँ ठीक से संभाल :)

+1

क्या गड़बड़ है? ऐसा लगता है कि यहां केवल दो संभावनाएं हैं: (1) एचटीटीपी स्पेक रीडायरेक्टिंग या अन्य विशेष मामलों के दौरान खराब प्रमाणपत्र की अनुमति देता है, लेकिन क्यूटी में एक बग है और रीडायरेक्ट को पहली जगह में एक्सेस करने से इंकार कर दिया जाता है (यह "बहुत सख्त" है)। या (2) Google प्रशासकों ने गलती की लेकिन ध्यान नहीं दिया क्योंकि इंटरनेट एक्सप्लोरर, फ़ायरफ़ॉक्स, क्रोम और अन्य प्रमुख ब्राउज़रों में गंभीर सुरक्षा छेद है। यहाँ क्या चल रहा है? –

+2

ठीक है, ऐसा लगता है कि क्यूटी औसत वेब ब्राउज़र की तुलना में एसएसएल त्रुटियों से कम सहनशील है।यह पता चला है कि जिस सर्वर पर मैं वास्तव में परवाह करता हूं उस पर वेबमास्टर सर्वर पर इंटरमीडिएट प्रमाणपत्र स्थापित नहीं करता है: http://www.sslshopper.com/ssl-certificate-not-trusted-error.html (अंतिम विकल्प देखें)। –

+0

ui में इन त्रुटियों को प्रदर्शित करने के लिए इसे '' 'example/network/securesocketclient''' के साथ संयोजित करना भी संभव है। –

0

मैं आमतौर पर "अर्नोल्ड स्पेंस" रों समाधान का उपयोग करना होगा, लेकिन कभी-कभी वह काम नहीं करेगा।

उस मामले में

सिर्फ इस

QSslConfiguration sslconf = QSslConfiguration::defaultConfiguration(); 
QList<QSslCertificate> cert_list = sslconf.caCertificates(); 
QList<QSslCertificate> cert_new = QSslCertificate::fromData("CaCertificates"); 
cert_list += cert_new; 

sslconf.setCaCertificates(cert_list); 
sslconf.setProtocol(QSsl::AnyProtocol); 
QSslConfiguration::setDefaultConfiguration(sslconf); 

यहाँ की तरह डिफ़ॉल्ट एसएसएल विन्यास बदल हम पूरे आवेदन के लिए विन्यास में बदलाव किए।

मैं आपको एसएसएलईआरआरआर सिग्नल को संभालने की सलाह देता हूं ..

संबंधित मुद्दे