C++ 如何在QtWebKit中拦截AJAX请求?

C++ 如何在QtWebKit中拦截AJAX请求?,c++,qt,qt4,phantomjs,qtwebkit,C++,Qt,Qt4,Phantomjs,Qtwebkit,我希望根据SSL证书的指纹拦截、检查和(如果需要)拒绝AJAX请求。我使用QNetworkAccessManager::createRequest(…)函数发出请求。当我使用QWebFrame::load(…)时,一切正常。甚至请求中加载的内容(如.css或.js文件)也会发出信号。不幸的是,没有AJAX请求发出任何信号。我知道这些信号连接到MyNetworkAccessManager::createRequest(…)函数中非常相同的插槽(用于“普通”和AJAX请求) QNetworkRepl

我希望根据SSL证书的指纹拦截、检查和(如果需要)拒绝AJAX请求。我使用
QNetworkAccessManager::createRequest(…)
函数发出请求。当我使用
QWebFrame::load(…)
时,一切正常。甚至请求中加载的内容(如.css或.js文件)也会发出信号。不幸的是,没有AJAX请求发出任何信号。我知道这些信号连接到
MyNetworkAccessManager::createRequest(…)
函数中非常相同的插槽(用于“普通”和AJAX请求)

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()));
QNetworkReply*reply=QNetworkAccessManager::createRequest(op、req、outgoingData);
连接(应答,信号(readyRead()),此,插槽(handleStarted());
连接(应答、信号(sslErrors(const-QList&))、此、插槽(handleSslErrors(const-QList&));
连接(应答,信号(错误(QNetworkReply::NetworkError)),此,插槽(HandlenNetworkError());

为什么AJAX请求如此不同?我在哪里可以访问它们?

据我所知,AJAX请求确实会在QNetworkAccessManager上发出完成的信号。您需要连接到QWebPage实例上的QNetworkAccessManager实例:

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'); });");
QWebPage*page=ui->webView->page();
QNetworkAccessManager*nam=page->networkAccessManager();
连接(nam,信号(完成(QNetworkReply*)),此,插槽(replyFinished(QNetworkReply*));
QFile文件;
file.setFileName(“:/js/jquery-2.1.1.min.js”);//jQuery作为资源加载
open(QIODevice::ReadOnly);
QString jQuery=file.readAll();
file.close();
用户界面->网络视图->加载(QUrl(“关于:空白”);
QWebFrame*frame=m_page->mainFrame();
frame->evaluateJavaScript(jQuery);//加载jQuery
//检查jQuery是否已加载
frame->evaluateJavaScript($(document.ready)(函数(){alert('jQuery-loaded!');}););
//进行AJAX获取吗
frame->evaluateJavaScript($.ajax({)
“url:”http://www.json-generator.com/api/json/get/cqkXBAEoQy?indent=2',"
方法:“获取”
“数据类型:'json'”
“}).done(函数(数据){”
“对于(var i=0;i
然后,您可以在replyFinished插槽中监视回复,如下所示:

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;
}
void主窗口::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()那么,您正试图显示一个页面,其中包含一些javascript代码,这些代码使用AJAX请求一些其他信息?这就是您要做的吗?不,我想访问服务器的SSL证书,以便进行SSL指纹匹配
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;
}