C++ Qt5.7 QNetworkProxy不考虑cookie
我正在开发一个使用QWebEngineView和QNetworkAccessManager的Qt云客户端应用程序。我遇到的问题如下所述: 应用程序有一个自定义的登录表单。基于用户凭据,我执行一系列手动请求(“post”和“get”)以获取相关会话cookieC++ Qt5.7 QNetworkProxy不考虑cookie,c++,qt,cookies,http-proxy,C++,Qt,Cookies,Http Proxy,我正在开发一个使用QWebEngineView和QNetworkAccessManager的Qt云客户端应用程序。我遇到的问题如下所述: 应用程序有一个自定义的登录表单。基于用户凭据,我执行一系列手动请求(“post”和“get”)以获取相关会话cookie ... //get session cookie QNetworkAccessManager accessManager; connect(&accessManager, &QNetworkA
...
//get session cookie
QNetworkAccessManager accessManager;
connect(&accessManager, &QNetworkAccessManager::proxyAuthenticationRequired, [=] (const QNetworkProxy &proxy, QAuthenticator *authenticator){
//perform proxy auth in case a proxy is set
});
QNetworkReply * reply = Q_NULLPTR;
QNetworkRequest request(QUrl(/*url*/));
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
request.setRawHeader("Cache-Control", "no-cache");
QByteArray data(/*data for auth*/);
reply = accessManager.post(request,data); //ajax login
QEventLoop waitReplyHandler;
QObject::connect(reply, SIGNAL(finished()), &waitReplyHandler, SLOT(quit()));
//wait for reply from url
waitReplyHandler.exec();
QVariant sessionCookie = reply->header(QNetworkRequest::SetCookieHeader); //this cookie is used to retrieve second "session cookie"
...
//Different function - get user session cookie
QNetworkRequest request(QUrl(/*url*/));
request.setHeader(QNetworkRequest::CookieHeader, sessionCookie);
QNetworkReply * reply = accessManager.get(request);
QEventLoop waitReplyHandler;
QObject::connect(reply, SIGNAL(finished()), &waitReplyHandler, SLOT(quit()));
//wait for reply from url
waitReplyHandler.exec();
QString redirect = reply->header(QNetworkRequest::LocationHeader).toString();
QVariant userSessionCookie = reply->header(QNetworkRequest::SetCookieHeader);
在此之后,我为QWebEngineView设置了一个请求拦截器:
interceptor = new CWebEngineUrlRequestInterceptor(sessionCookie.value<QList<QNetworkCookie>>().first(),
userSessionCookie.value<QList<QNetworkCookie>>().first(),
this);
m_tabWebview->webEngineView()->page()->profile()->setRequestInterceptor(interceptor);
m_tabWebview->webEngineView()->load(redirectUrl); //Obtained from "redirect" string variable from second manual request
这项工作完全正常,加载到重定向URL后,web视图将显示用户已登录的云主页。但是,如果我将QNetworkProxy设置为应用程序:
QNetworkProxy proxy;
proxy.setType(QNetworkProxy::HttpProxy);
proxy.setHostName(proxyUrl);
proxy.setPort(proxyPort.toInt());
QNetworkProxy::setApplicationProxy(proxy);
上述顺序将在web视图中显示我的目标url的登录页面。我认为应用程序级代理设置应该与QWebEngineView无关。手动请求正在工作,我能够获得cookie,拦截请求也被称为,但代理中继后cookie不会保留。
我还尝试手动将标头设置为代理本身:
QByteArray requestCookies = m_cookies.first().name() + "=" + m_cookies.first().value() + "; " +
m_cookies.last().name() + "=" + m_cookies.last().value();
QNetworkProxy proxy(QNetworkProxy::applicationProxy());
proxy.setRawHeader(QByteArray("Cookie"), requestCookies);
QNetworkProxy::setApplicationProxy(proxy);
//...
//check headers are set to proxy
QByteArray cookieVar = QNetworkProxy::applicationProxy().rawHeader(QByteArray("Cookie"));
if(cookieVar.isEmpty()){
std::cout<<"empty cookies to proxy ";
}
else{
std::cout<<cookieVar.toStdString()<<std::endl;
}
QByteArray requestCookies=m_cookies.first().name()+“=”+m_cookies.first().value()+“;”+
m_cookies.last().name()+“=”+m_cookies.last().value();
QNetworkProxy代理(QNetworkProxy::applicationProxy());
setRawHeader(QByteArray(“Cookie”)、requestCookies;
QNetworkProxy::setApplicationProxy(代理);
//...
//检查头设置为代理
QByteArray cookieVar=QNetworkProxy::applicationProxy().rawHeader(QByteArray(“Cookie”);
if(cookieVar.isEmpty()){
std::cout这似乎是web引擎框架中与代理身份验证机制相关的一个错误。但是我找到了一个解决方法:
当调用QWebEnginePage::proxyAuthenticationRequired时,在设置了authenticator对象的数据之后,我只需再次调用load to requestUrl参数
connect(app->webview()->page(), &QWebEnginePage::proxyAuthenticationRequired, [=] (const QUrl &requestUrl, QAuthenticator *authenticator, const QString &proxyHost){
proxyAuthSequence(authenticator, proxyHost);
app->webview()->load(requestUrl);
});
ideea将初始加载视为虚拟加载,仅用于设置身份验证数据,然后再次加载url。后续加载调用将不再触发此信号。因此,基本上问题在于身份验证机制
该错误也已提交给Qt:
这似乎是web引擎框架中与代理身份验证机制相关的一个错误。但是我找到了一个解决方法:
当调用QWebEnginePage::proxyAuthenticationRequired时,在设置了authenticator对象的数据之后,我只需再次调用load to requestUrl参数
connect(app->webview()->page(), &QWebEnginePage::proxyAuthenticationRequired, [=] (const QUrl &requestUrl, QAuthenticator *authenticator, const QString &proxyHost){
proxyAuthSequence(authenticator, proxyHost);
app->webview()->load(requestUrl);
});
ideea将初始加载视为虚拟加载,仅用于设置身份验证数据,然后再次加载url。后续加载调用将不再触发此信号。因此,基本上问题在于身份验证机制
该错误也已提交给Qt: