Как мне сохранить куки с Qt?

Я пытаюсь сохранить файлы cookie, созданные моим приложением, на диске, например C:\Users\Username\AppData\Local\MyCompany\MyApp, Я реализовал веб-просмотр и почти закончил кодировать свой простой браузер, и последнее, что нужно сделать, это сохранить куки.

Я могу qDebug () использовать файлы cookie, которые я получаю из веб-приложения, и они показывают, что файлы cookie сформированы правильно, но я а) не уверен, куда идти, и б) не уверен на 100%, как сделать подкласс класса cookiejar?

Ниже я создаю свой объект cookiejar в конструкторе MainWindow

view = new QWebView(this);
jar = new QNetworkCookieJar;
view->page()->networkAccessManager()->setCookieJar(jar);

И в моем слоте для ответов я вижу файл cookie, содержащийся в ответе, и пытаюсь сохранить его, но ничего не происходит, и я не получаю ошибок времени выполнения. В этом нет ничего особенного, и мы видели несколько постов, в которых указывалось, как создать подкласс QNetworkCookieJar, но не делали подкласса в Qt / C ++ раньше.

Есть ли простой способ хранения куки, я не ищу ничего необычного. Файлы cookie просто проверяют, установлены ли некоторые флажки на странице входа.

// SLOT that accepts the read data from the webpage
void MainWindow::slotReplyFinished(QNetworkReply *reply){

if(reply->isFinished()){
QVariant variantCookies = reply->header(QNetworkRequest::SetCookieHeader);
QList<QNetworkCookie> cookies = qvariant_cast<QList<QNetworkCookie> >(variantCookies);
qDebug() << "Cookies reply: " << cookies;
QNetworkCookie cookie; //Create a cookiejar = new QNetworkCookieJar;
//view->page()->networkAccessManager()->setCookieJar(jar);
jar->setCookiesFromUrl(cookies, reply->request().url());
//qDebug() << "Saved cookies: " << jar->getAllCookies();
}

qDebug() << "Network reply: " << reply->errorString() << reply->error() << reply->request().url();
}

4

Решение

Вам нужно будет создать подкласс QNetworkCookieJar, и в этом классе вы должны реализовать свое собственное постоянное хранилище.

class MyNetworkCookieJar : public QNetworkCookieJar {

public:

bool saveCookiesToDisk() {
// .. my implementation
return true; // if i did
}

bool loadCookiesFromDisk() {
// .. load from disk
return false; // if unable to.
}
}

Пример приложения из проекта Qt реализует постоянное хранилище файлов cookie, это может быть хорошей отправной точкой для вас: http://qt.gitorious.org/qt/qt/trees/4.8/demos/browser

посмотрите на cookiejar.h и cookiejar.cpp

6

Другие решения

Пример базы qt, http://qt.gitorious.org/qt/qt/trees/4.8/demos/browser, Я написал этот класс, чтобы сохранить и использовать один файл cookie для меня. Возможно, это вам тоже поможет. Обратите внимание, что это просто сохранить один файл cookie, а не список файлов cookie.

#include "cookiejar.h"

CookieJar::CookieJar(QObject *parent)
: QNetworkCookieJar(parent)
, m_loaded(false)
{
}

void CookieJar::load()
{
if (m_loaded)
return;

QSettings settings;
settings.beginGroup(QLatin1String("cookies"));
QList<QNetworkCookie> savedCookies = QNetworkCookie::parseCookies(settings.value("cookies").toByteArray());

for (int j = 0; j < savedCookies.count(); j++)
insertCookie(savedCookies.at(j));

m_loaded = true;
emit cookiesChanged();
}

void CookieJar::save()
{
if (!m_loaded)
return;

QList<QNetworkCookie> cookies = allCookies();

QSettings settings;
settings.beginGroup(QLatin1String("cookies"));
settings.setValue("cookies", cookies[0].toRawForm());
}

QList<QNetworkCookie> CookieJar::cookiesForUrl(const QUrl &url) const
{
// This function is called by the default QNetworkAccessManager::createRequest(),
// which adds the cookies returned by this function to the request being sent.

CookieJar *that = const_cast<CookieJar*>(this);
if (!m_loaded)
that->load();

return QNetworkCookieJar::cookiesForUrl(url);
}

bool CookieJar::setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url)
{
if (!m_loaded)
load();

QNetworkCookieJar::setCookiesFromUrl(cookieList, url);
save();     //Save cookie permanently in setting file.
emit cookiesChanged();
return true;
}
4

Ответ @ Мусы хорош, но он спасает только одно печенье. Я рекомендую использовать реализацию Qt folk из старого qmlviewer, расположенного здесь: http://code.qt.io/cgit/qt/qt.git/tree/tools/qml/qmlruntime.cpp?h=4.7#n438

Вот код:

class PersistentCookieJar : public QNetworkCookieJar {
public:
PersistentCookieJar(QObject *parent) : QNetworkCookieJar(parent) { load(); }
~PersistentCookieJar() { save(); }

virtual QList<QNetworkCookie> cookiesForUrl(const QUrl &url) const
{
QMutexLocker lock(&mutex);
return QNetworkCookieJar::cookiesForUrl(url);
}

virtual bool setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url)
{
QMutexLocker lock(&mutex);
return QNetworkCookieJar::setCookiesFromUrl(cookieList, url);
}

private:
void save()
{
QMutexLocker lock(&mutex);
QList<QNetworkCookie> list = allCookies();
QByteArray data;
foreach (QNetworkCookie cookie, list) {
if (!cookie.isSessionCookie()) {
data.append(cookie.toRawForm());
data.append("\n");
}
}
QSettings settings;
settings.setValue("Cookies",data);
}

void load()
{
QMutexLocker lock(&mutex);
QSettings settings;
QByteArray data = settings.value("Cookies").toByteArray();
setAllCookies(QNetworkCookie::parseCookies(data));
}

mutable QMutex mutex;
};
1
По вопросам рекламы [email protected]