首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QWebEngine中设置QNetworkCookieJar?

如何在QWebEngine中设置QNetworkCookieJar?
EN

Stack Overflow用户
提问于 2014-12-12 03:29:20
回答 1查看 3.3K关注 0票数 3

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

代码语言:javascript
复制
QNetworkAccessManager *nam = new QNetworkAccessManager();    
nam->setCookieJar(cookieJar);
webView->page()->setNetworkAccessManager(nam);    

这就像一个护身符一样有效。

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

EN

回答 1

Stack Overflow用户

发布于 2016-07-13 20:18:53

我找到了一个解决方案,使用QWebEngineCookieStore与QWebEngine和QNetworkAccesManager共享Cookie。子类QNetworkCookieJar:

代码语言:javascript
复制
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加载/保存到文件中的函数:

代码语言:javascript
复制
// 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:

代码语言:javascript
复制
void CookieWebEngine::handleCookieAdded(const QNetworkCookie &cookie)
{
    if (insertCookie(cookie)) {
        qDebug() << "Handle cookie " << cookie;
    }
}

它对我来说工作得很好。现在,我使用铬进行登录。之后,我将会话cookie保存在定制的cookiejar中,并在定制的QNetworkAccesManager中使用它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27430864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档