Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用Qt保存cookies?_C++_Qt_Cookies_Qnetworkaccessmanager - Fatal编程技术网

C++ 如何使用Qt保存cookies?

C++ 如何使用Qt保存cookies?,c++,qt,cookies,qnetworkaccessmanager,C++,Qt,Cookies,Qnetworkaccessmanager,我正在尝试将应用程序生成的cookie保存到磁盘位置,例如C:\Users\Username\AppData\Local\MyCompany\MyApp。我已经实现了一个webview,并且已经基本完成了简单浏览器的编码。最后要做的就是保存cookies 我可以qDebug()我从webapp获得的cookies,它们显示cookies的格式正确,但我a)不确定从那里去哪里,b)不100%确定如何创建cookiejar类的子类 下面,我在主窗口构造函数中创建cookiejar对象 view =

我正在尝试将应用程序生成的cookie保存到磁盘位置,例如
C:\Users\Username\AppData\Local\MyCompany\MyApp
。我已经实现了一个webview,并且已经基本完成了简单浏览器的编码。最后要做的就是保存cookies

我可以qDebug()我从webapp获得的cookies,它们显示cookies的格式正确,但我a)不确定从那里去哪里,b)不100%确定如何创建cookiejar类的子类

下面,我在主窗口构造函数中创建cookiejar对象

view = new QWebView(this);
jar = new QNetworkCookieJar;
view->page()->networkAccessManager()->setCookieJar(jar);
在我的replyfinished插槽中,我可以看到回复中包含的cookie,我尝试保存它,但什么也没有发生,也没有收到运行时错误。在这方面没有太多的内容,并且已经看到了一些帖子,其中的指令是生成一个子类QNetworkCookieJar,但之前没有在Qt/C++中生成子类

有没有一个简单的方法来储存饼干,我不寻找任何花哨的东西。cookies只是确保在登录页面上勾选了一些复选框

// 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();
 }
//接受从网页读取数据的插槽
void主窗口::slotReplyFinished(QNetworkReply*reply){
如果(回复->isFinished()){
QVariant variantCookies=reply->header(QNetworkRequest::SetCookieHeader);
QList cookies=qvariant_cast(variantCookies);
qDebug()networkAccessManager()->setCookieJar(jar);
jar->setCookiesFromUrl(cookies,reply->request().url());

//qDebug()您需要将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存储,这可能是您的一个良好起点:

看看qt示例的cookiejar.h和cookiejar.cpp,我编写了这个类,它为我保存并使用了一个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;
}
#包括“cookiejar.h”
CookieJar::CookieJar(QObject*parent)
:QNetworkCookieJar(父级)
,m_已加载(错误)
{
}
void CookieJar::load()
{
如果(m_加载)
返回;
QSettings设置;
settings.beginGroup(QLatin1String(“cookies”);
QList savedCookies=QNetworkCookie::parseCookies(settings.value(“cookies”).toByteArray());
对于(int j=0;j加载();
返回QNetworkCookieJar::cookiesForUrl(url);
}
bool CookieJar::setCookiesFromUrl(常量QList和cookieList,常量QUrl和url)
{
如果(!m_已加载)
加载();
QNetworkCookieJar::setCookieFromURL(cookieList,url);
save();//将cookie永久保存在设置文件中。
发射cookiesChanged();
返回true;
}

@Musa的答案很好,但它只保存了一个cookie。我建议使用Qt-folk的实现,该实现来自旧的qmlviewer,位于以下位置:

代码如下:

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;
};
类PersistentCookieJar:publicQnetworkCookiejar{
公众:
PersistentCookieJar(QObject*parent):QNetworkCookieJar(parent){load();}
~PersistentCookieJar(){save();}
虚拟QList cookiesForUrl(常量QUrl&url)常量
{
QMutexLocker锁(&mutex);
返回QNetworkCookieJar::cookiesForUrl(url);
}
虚拟布尔集合CookiesFromURL(常量QList和cookieList、常量QUrl和url)
{
QMutexLocker锁(&mutex);
返回QNetworkCookieJar::SetCookieFromURL(cookieList,url);
}
私人:
作废保存()
{
QMutexLocker锁(&mutex);
QList list=allCookies();
QByteArray数据;
foreach(QNetworkCookie cookie,列表){
如果(!cookie.isSessionCookie()){
data.append(cookie.toRawForm());
数据。追加(“\n”);
}
}
QSettings设置;
设置值(“Cookies”,数据);
}
空荷载()
{
QMutexLocker锁(&mutex);
QSettings设置;
QByteArray数据=settings.value(“Cookies”).toByteArray();
SetAllCookie(QNetworkCookie::ParseCookie(数据));
}
可变QMutex互斥体;
};

感谢您的快速回复,我会看一看,尽管我不完全确定如何实现。看起来所有这些代码都需要进入头类文件,将其包含在MainWindow.cpp中,然后我就可以调用该函数了。很抱歉,还有代码块的部分
/…我的实现
我不完全确定是什么cookiejar函数能否实现这两个目标?我想我需要重新实现setCookiesFromUrl(),但不太确定如何实现?请看我发布的链接中的cookiejar.cpp文件,它有一个实现,您可以直接使用它。检查我共享的链接。