2014-06-11 15 views
6

Tôi muốn chặn, kiểm tra và (nếu cần) từ chối các yêu cầu AJAX dựa trên Vân tay của chứng chỉ SSL. Tôi sử dụng hàm QNetworkAccessManager::createRequest(...) để đưa ra yêu cầu. Mọi thứ hoạt động tốt khi tôi sử dụng QWebFrame::load(...). Ngay cả nội dung được tải trong yêu cầu (như tệp .css hoặc .js) phát ra tín hiệu. Thật không may là AJAX-Requests phát ra bất kỳ Tín hiệu nào. Tôi biết rằng các Tín hiệu được kết nối với các vị trí rất giống nhau (đối với "bình thường" cũng như các yêu cầu AJAX) trong hàm MyNetworkAccessManager::createRequest(...).Làm cách nào để chặn các yêu cầu AJAX trong QtWebKit?

QNetworkReply *reply = QNetworkAccessManager::createRequest(op, req, outgoingData); 
connect(reply, SIGNAL(readyRead()), this, SLOT(handleStarted())); 
connect(reply, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(handleSslErrors(const QList<QSslError> &))); 
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleNetworkError())); 

Tại sao yêu cầu AJAX lại khác biệt? Tôi có thể truy cập chúng ở đâu?

+0

Vì vậy, bạn đang cố gắng hiển thị một trang có chứa mã javascript yêu cầu một số thông tin khác bằng AJAX? Đó là những gì bạn đang làm? –

+0

không, tôi muốn truy cập Chứng chỉ SSL của Máy chủ, để khớp với vân tay SSL – Senad

Trả lời

2

Từ những gì tôi có thể biết, yêu cầu AJAX phát ra tín hiệu đã hoàn thành trên QNetworkAccessManager. Bạn cần kết nối với trường hợp của QNetworkAccessManager trên dụ QWebPage của bạn:

QWebPage *page = ui->webView->page(); 
QNetworkAccessManager *nam = page->networkAccessManager(); 

connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); 

QFile file; 
file.setFileName(":/js/jquery-2.1.1.min.js"); // jQuery is loaded as a resource 
file.open(QIODevice::ReadOnly); 
QString jQuery = file.readAll(); 
file.close(); 

ui->webView->load(QUrl("about:blank")); 
QWebFrame *frame = m_page->mainFrame(); 


frame->evaluateJavaScript(jQuery); // load jQuery 

// check that jQuery is loaded 
frame->evaluateJavaScript("$(document).ready(function() { alert('jQuery loaded!'); });"); 

// do an AJAX GET 
frame->evaluateJavaScript("$.ajax({" 
          "url: 'http://www.json-generator.com/api/json/get/cqkXBAEoQy?indent=2'," 
          "method: 'GET'," 
          "dataType: 'json'" 
         "}).done(function (data) {" 
          "for (var i = 0; i < data.length; i++) {" 
           "alert(data[i].name);" 
          "}" 
         "}).error(function (data) { alert('AJAX error'); });"); 

Sau đó, bạn có thể giám sát trả lời trong khe replyFinished như vậy:

void MainWindow::replyFinished(QNetworkReply *reply) 
{ 
    QByteArray bytes = reply->readAll(); 
    QString str = QString::fromUtf8(bytes.data(), bytes.size()); 
    QString replyUrl = reply->url().toString(); 
    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
    qDebug() << statusCode; 
    qDebug() << replyUrl; 
    qDebug() << str; 
} 

tôi đã nhận thấy rằng lời hứa done jQuery AJAX của không dường như thực thi khi bạn làm bất cứ điều gì với QNetworkReply, nhưng bạn có thể thấy rằng yêu cầu thực sự kết thúc trong bảng điều khiển gỡ lỗi.

Xem kho GitHub của tôi để thử đoạn code trên: https://github.com/pcmantinker/QtWebkitAJAX

Theo như chặn các kết nối dựa trên giấy chứng nhận SSL, bạn sẽ phải phân lớp QNetworkAccessManager và ghi đè QNetworkAccessManager :: createRequest. Một cái gì đó như thế này có thể hoạt động:

QNetworkReply *CustomQNetworkAccessManager::createRequest(Operation op, const QNetworkRequest& request, QIODevice* outgoingData) 
{ 
    QNetworkRequest req(request); 
    QNetworkReply *reply = QNetworkAccessManager::createRequest(op, req, outgoingData); 
    QSslConfiguration *sslConfig = reply->sslConfiguration(); 
    QList<QSslCertificate> sslCaCerts = sslConfig->caCertificates(); 
    // do something with sslCaCerts 

    return reply; 
} 
Các vấn đề liên quan