如何在QWebEngine中设置QNetworkCookieJar? [英] How to set QNetworkCookieJar in QWebEngine?

查看:3706
本文介绍了如何在QWebEngine中设置QNetworkCookieJar?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在QWebView中,可以通过QNetworkAccessManager设置QNetworkCookieJar。

In QWebView it was possible to set a QNetworkCookieJar via QNetworkAccessManager.

QNetworkAccessManager *nam = new QNetworkAccessManager();    
nam->setCookieJar(cookieJar);
webView->page()->setNetworkAccessManager(nam);    

这是一个魅力。

如何在Qt5.4中引入的新QWebEngine类中设置QNetworkCookieJar?

How can I set a QNetworkCookieJar in new QWebEngine class introduced in Qt5.4?

推荐答案

使用QWebEngine和QNetworkAccesManager通过使用QWebEngineCookieStore。子类QNetworkCookieJar:

I found a solution, to share Cookies with QWebEngine and QNetworkAccesManager by using QWebEngineCookieStore. Subclass QNetworkCookieJar:

class CookieWebEngine : public QNetworkCookieJar
{
.....
protected:
    // Reimplement this functions to work with your _cookies list;
    bool insertCookie(const QNetworkCookie &cookie);
    bool deleteCookie(const QNetworkCookie &cookie);
    bool updateCookie(const QNetworkCookie &cookie);
    bool validateCookie(const QNetworkCookie &cookie, const QUrl &url) const;
private:
    // Save Chromium Cookies
    QWebEngineCookieStore *_store;
    // Save available cookies
    QList<QNetworkCookie> _cookies;
}



现在,让我们实现一个函数来在文件中加载/保存cookie: / p>

Now, lets implement a function to load/save cookies in a file:

// Load Chromium Cookies
void CookieWebEngine::loadStore() {
    // Save cookies profile shared
    QWebEngineProfile::defaultProfile()->setPersistentCookiesPolicy(QWebEngineProfile::ForcePersistentCookies);
    _store = WebEngineProfile::defaultProfile()->cookieStore();
    connect(_store, &QWebEngineCookieStore::cookieAdded, this, &CookieWebEngine::handleCookieAdded);
    _store->loadAllCookies();
}
// Load/Save cookies in arraylist in a file
void CookieWebEngine::load() {

    // load cookies and exceptions
    qRegisterMetaTypeStreamOperators<QList<QNetworkCookie> >("QList<QNetworkCookie>");
    const QString location = cookiesDirectory() + COOKIES_FILE;
    QSettings cookieSettings(location, QSettings::IniFormat);
    _cookies = qvariant_cast<QList<QNetworkCookie> >(cookieSettings.value(QLatin1String("cookies")));
    setAllCookies(_cookies);
    // Now user iterate and add it to chromium
    for (auto cookie : _cookies) {
       _store->setCookie(cookie);
    }
    cookieSettings.sync();
}

void CookieWebEngine::save()
{
    QString directory = cookiesDirectory();
    if (!QFile::exists(directory)) {
        QDir dir;
        dir.mkpath(directory);
    }
    const QString location = directory + COOKIES_FILE;
    QSettings cookieSettings(location, QSettings::IniFormat);
    cookieSettings.setValue(QLatin1String("cookies"), QVariant::fromValue<QList<QNetworkCookie>>(_cookies));
    cookieSettings.sync();
}

现在,只需连接并处理从webview加载的cookie:

Now, just connect and handle cookies loaded from the webview:

void CookieWebEngine::handleCookieAdded(const QNetworkCookie &cookie)
{
    if (insertCookie(cookie)) {
        qDebug() << "Handle cookie " << cookie;
    }
}

现在,我使用铬登录。之后,我保存我的会话cookie在自定义cookiejar,我使用它在我的自定义QNetworkAccesManager。

Its working well for me. Now, i use chromium to sign in. After, i save my session cookie in the customized cookiejar and I use it in my customized QNetworkAccesManager.

这篇关于如何在QWebEngine中设置QNetworkCookieJar?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆