删除会话cookie qt

问题描述 投票:0回答:2

我有一个qt应用程序,我将所有会话cookie存储在cookieJar中。为了删除会话,即使没有关闭应用程序,我正在按下按钮时调用cookieJar->deleteLater();

这引发了以下错误:The inferior stopped because it triggered an exception. Stopped in thread 0 by: Exception at 0x54d6559d, code: 0xc0000005: write access violation at: 0x1, flags=0x0 (first chance)

cookieJar目前是一个公共变量,它以当前类作为父类进行初始化。为什么我仍然无法删除它?

c++ qt session cookies qnetworkaccessmanager
2个回答
0
投票

您不需要销毁QNetworkCookieJar,因为:

Note: QNetworkAccessManager takes ownership of the cookieJar object.

删除QNetworkCookieJar实例将导致QNetworkAccessManager访问错误的指针。

您可以通过以下方式删除所有cookie条目:

foreach (QNetworkCookie& cookie, networkAccessManager->cookieKar()->allCookies())
{
    networkAccessManager->cookieKar()->deleteCookie(cookie);
}

0
投票

要为一般情况执行此操作,您可能必须将其子类化,因此您可以访问allCookies()或setAllCookies()。

我结束了这个烂摊子,在网络请求后清除它们:

void YahooCookieTest::replyReady(QNetworkReply *reply)
{
    QList<QNetworkCookie> cookies =
      reply->header(QNetworkRequest::SetCookieHeader).value< QList<QNetworkCookie> >();

    // read cookies if desired

    foreach (const QNetworkCookie &c, cookies)
        namNetAccessManager.cookieJar()->deleteCookie(c);

    // etc. ...

这些cookiejar结构特别难以使用。如果没有模板转换,则不允许获取标头的value()。没有办法为你清空饼干罐。您甚至无法获取cookie jar中的所有cookie,而无需对其进行子类化。您可以使用QString设置cookie,但不能将其作为QStrings访问。我非常喜欢Qt;但我觉得这个特殊的角落是糟糕的API设计。为了防止不必要的子类化,在我看来,你所做的一切都是为了减少对事物的保护!

我只尝试过一个cookie的情况。我认为它会更有效;但我没有做出任何承诺。

© www.soinside.com 2019 - 2024. All rights reserved.