如何在 QWebEngine 中设置 QNetworkCookieJar?

Posted

技术标签:

【中文标题】如何在 QWebEngine 中设置 QNetworkCookieJar?【英文标题】:How to set QNetworkCookieJar in QWebEngine? 【发布时间】:2014-12-11 19:29:19 【问题描述】:

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

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

这就像一个魅力。

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

【问题讨论】:

你不能,QtWebEngine不使用QtNetworkAccessManager:qt-project.org/wiki/… 我知道将 QNetworkAccessManager 注入 QWebEngine 是不可能的。我正在寻找将 cookie 注入 QWebEngine/QWebEnginePage 的替代方法。 Yeah, the official example is mixing things up to work it around. @lpapp 但是那个例子似乎不起作用。 【参考方案1】:

我找到了一个解决方案,通过使用 QWebEngineCookieStore 与 QWebEngine 和 QNetworkAccesManager 共享 Cookie。子类 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:

// 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:

void CookieWebEngine::handleCookieAdded(const QNetworkCookie &cookie)

    if (insertCookie(cookie)) 
        qDebug() << "Handle cookie " << cookie;
    

它对我来说很好用。现在,我使用 chromium 登录。之后,我将会话 cookie 保存在自定义的 cookiejar 中,并在自定义的 QNetworkAccesManager 中使用它。

【讨论】:

以上是关于如何在 QWebEngine 中设置 QNetworkCookieJar?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 函数中执行 QWebEngine

如何在 RequestInterceptor 中正确设置 QWebEngine HTTP 标头

在最新Qt5.4,使用QWebengine,如何js调用Qt

在最新Qt5.4,使用QWebengine,如何js调用Qt

在最新Qt5.4,使用QWebengine,如何js调用Qt

如何在 Netbeans 中设置环境变量?