【问题标题】:Delete session cookies qt删除会话 cookie qt
【发布时间】:2014-10-01 17:55:15
【问题描述】:

我有一个 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 当前是一个公共变量,它是用当前类作为父类初始化的。为什么我还是删不掉?

【问题讨论】:

  • 也许尝试在QNetworkCookieJar::setAllCookies() 中传递空列表而不是删除。这个异常看起来你使用了错误的指针(非现有指针)
  • @Chernobyl :我之前尝试过(QList<QNetworkCookie> cookieList = new QList<QNetworkCookie>(); cookieJar->setAllCookies(&cookieList);)但这不起作用。介意告诉我如何传递一个空的 QList?
  • 新的?你不用指针,不妨试试这个:QList<QNetworkCookie> cookieList(); cookieJar->setAllCookies(cookieList)

标签: c++ qt session cookies qnetworkaccessmanager


【解决方案1】:

你不需要销毁 QNetworkCookieJar,因为:

Note: QNetworkAccessManager takes ownership of the cookieJar object.

删除QNetworkCookieJar实例会导致QNetworkAccessManager访问坏指针。

您可以执行以下操作来删除所有 cookie 条目:

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

【讨论】:

  • 好的。那么究竟如何才能清除所有cookie,以便成功删除会话并注销呢?
  • NETWORK_ACCESS_MANAGER->cookieJar()->setAllCookies(QList());应该很好用
  • 刚刚实现,现在报这个错误:QNetworkCookieJar::setAllCookies cannot access protected member declared in class 'QNetworkCookieJar'
  • 你说得对,它是受保护的,我会更新答案...你可以实例化新的 QNetworkCookieJar 来替换旧的,或者先获取所有 cookie 的列表,然后将它们一个一个删除。
  • allCookies 也受到保护。你显然没有尝试过这个。 cookieKar 可能是小丑车形状的马戏团饼干吗?
【解决方案2】:

要为一般情况执行此操作,您可能必须对其进行子类化,以便您可以访问 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 罐中的所有 cookie。您可以使用 QString 设置 cookie,但不能将它们作为 QString 访问。我非常喜欢 Qt;但我觉得它的这个特殊角落是糟糕的 API 设计。为了防止不必要的子类化,在我看来,你要做的就是减少受保护的东西!

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

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 2012-08-12
    • 2016-06-17
    • 2012-05-23
    • 2010-11-08
    • 2022-01-03
    • 2012-09-01
    相关资源
    最近更新 更多