2

我正在构建一个基于 Qtwebkit 的专用浏览器。我想在登录经过身份验证的网站时保存会话信息,并在重新启动浏览器时再次加载此信息。我怎样才能做到这一点?

4

2 回答 2

2

大多数网站使用 cookie 来存储会话 ID。您可以使用保存 cookie 并将其加载回使用 您可以使用 ,您可以通过使用来使用
QList<QNetworkCookie> QNetworkCookieJar::allCookies () const

void QNetworkCookieJar::setAllCookies(const QList<QNetworkCookie> & cookieList)
QNetworkCookieJar
QNetworkCookieJar * QNetworkAccessManager::cookieJar () const
QNetworkAccessManagerQWebPage
QNetworkAccessManager * QWebPage::networkAccessManager () const

会话 ID 也可以存储为 url 的一部分或页面上的隐藏表单字段。如果网站使用前者,保存 url 就足够了,如果使用后者,你也必须保存页面本身。

当可以使用Web 存储时,任务现在变得更加复杂。如果网站使用网络存储,除了上述所有数据之外,您还应该注意保存和恢复它。您可以使用设置离线存储位置 并使用获取它您可能会在webkit-qt邮件列表和 freenode.net 上的#qtwebkit IRC 频道上 获得更多信息
void QWebSettings::setOfflineStoragePath(const QString & path)

QString QWebSettings::offlineStoragePath ()

于 2010-12-18T13:20:30.487 回答
0

你可以参考QNetworkCookieJar的虚拟成员函数 bool CookieHandler::setCookiesFromUrl (const QList<QNetworkCookie> & cookieList, const QUrl & url),可以用来将cookies保存到你自己的持久化存储中。例如,

bool CookieHandler::setCookiesFromUrl (const QList<QNetworkCookie> & cookieList, const QUrl & url) {
    foreach(QNetworkCookie i, cookieList) {
    // probably don't want to store session cookies
    if (!i.isSessionCookie()) {
      // save the cookie to own storage format
    }
}
return true;

}

protected 成员函数void QNetworkCookieJar::setAllCookies ( const QList<QNetworkCookie> & cookieList )用于将 cookie 从您自己的存储恢复到 QNetworkCookieJar,因为 QNetworkCookieJar 不实现永久存储:它仅将 cookie 保存在内存中。示例代码,

void CookieHandler::setAllCookiestoJar() {
    // retrieve cookies from local database
    QList<QNetworkCookie> cookieList = this->getCookiesFromLocalDB();
    this->setAllCookies(cookieList);
    // check if they are correctly loaded
    QList<QNetworkCookie> cookieList_tmp = this->allCookies();
    foreach(QNetworkCookie i, cookieList_tmp)
      qDebug() << i.toRawForm(QNetworkCookie::Full);

}

于 2012-02-08T12:24:37.877 回答