在 Qt 中,QWebView 和 QNetworkRequest 不能共享 cookie

Posted

技术标签:

【中文标题】在 Qt 中,QWebView 和 QNetworkRequest 不能共享 cookie【英文标题】:In Qt, QWebView and QNetworkRequest can't share the cookies 【发布时间】:2013-09-10 12:18:49 【问题描述】:

我使用Qt,我发现QWebView和QNetworkRequest在我的程序中不能共享cookies。

我知道我应该将 cookiejar 设置为 QNetworkAccessManager 并共享它,所以:

networkAccessManager = new QNetworkAccessManager();
networkAccessManager->setCookieJar(new CCookieJar);

QWebView* webView = new QWebView(this);
webView->page()->setNetworkAccessManager(networkAccessManager);

当我使用 webView 加载网站并登录时。没关系。 但是当我设置了一个定时器来使用QNetworkRequest下载html时,webView会在网站中注销,我看起来cookie已经被重置了,所以sessionid发生了变化。

QString surl = "http://www.website.com"
QNetworkRequest request;
request.setUrl(QUrl(surl));
QList<QNetworkCookie> cookies = networkAccessManager->cookieJar()->cookiesForUrl(surl);
for(QList<QNetworkCookie>::iterator it = cookies.begin(); it!=cookies.end(); it++)

    request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue<QNetworkCookie>(*it));

QNetWorkReply* reply = networkAccessManager->get(request)
connect(reply, SIGNAL(finished()), this, SLOT(httpFinished()));

在 httpFinished 中,我将 cookie 设置为 networkAccessManager。

QNetworkReply* reply = qobject_cast<QNetworkReply *>(sender());
QVariant varCookies = reply->header(QNetworkRequest::SetCookieHeader);
QList<QNetworkCookie> cookies = varCookies.value< QList<QNetworkCookie> >();
networkAccessManager->cookieJar()->setCookiesFromUrl(cookies, reply->url());
reply->deleteLater();

我希望 webView 和 QNetworkRequest 得到的结果可以共享会话,这样我就可以在登录状态下获取数据。但是我的程序不起作用。我通过搜索相同的示例编写程序代码。

你能不能告诉我我的程序出了什么问题,以及如何纠正它。谢谢!

【问题讨论】:

【参考方案1】:

在我尝试之后,我发现我应该做的就是将 webView 的 User-Agent 标头添加到请求中。

例如:

request.setRawHeader("User-Agent", "mozilla/5.0 (windows NT 5.1) applewebki...");

或者重写QWebPage的函数userAgentForUrl(const QUrl& url),返回你在请求中使用的代理。

【讨论】:

以上是关于在 Qt 中,QWebView 和 QNetworkRequest 不能共享 cookie的主要内容,如果未能解决你的问题,请参考以下文章

QWebView 类是不是在 Qt 5.0.0 中工作?

QT:如何在点击事件上展开/折叠文本(qtextbrowser,qwebview,...)

Qt 4.6 将对象和子对象添加到 QWebView 窗口对象(C++ 和 Javascript)

Qt - QWebView 问题

Qt 5.3 使用原来的QT4.8.4项目时QWebView QWebFrame

使用 QWebview 会产生编译错误,但不是因为 .pro 文件中缺少 Qt += webkit