4

アプリによって生成されたCookieをなどのディスクの場所に保存しようとしていC:\Users\Username\AppData\Local\MyCompany\MyAppます。私はWebビューを実装し、単純なブラウザーのコーディングをほぼ完了しました。最後に行うことは、Cookieを保存することです。

Webアプリから取得したCookieをqDebug()できますが、Cookieが正しく形成されていることを示していますが、a)そこからどこに行くのかわからず、b)cookiejarクラスのサブクラスを作成する方法が100%わかりませんか?

以下では、MainWindowコンストラクターでcookiejarオブジェクトを作成します

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

そして、replyfinishedスロットで、返信に含まれている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 cookie



        jar = 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

3 に答える 3

6

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を見てください

于 2012-12-20T12:20:37.220 に答える
4

qtの例のベース、http://qt.gitorious.org/qt/qt/trees/4.8/demos/browser、私は1つのCookieを保存して使用するこのクラスを作成しました。おそらくそれはあなたにも役立ちます。Cookieのリストではなく、1つの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;
}
于 2015-08-01T11:09:53.023 に答える
2

@Musaの答えは良いですが、保存されるCookieは1つだけです。ここにある古いqmlviewerからのQtフォークの実装を使用することをお勧めします: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;
};
于 2016-07-08T14:42:24.490 に答える