Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt5.7 QNetworkProxy不考虑cookie_C++_Qt_Cookies_Http Proxy - Fatal编程技术网

C++ Qt5.7 QNetworkProxy不考虑cookie

C++ 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

我正在开发一个使用QWebEngineView和QNetworkAccessManager的Qt云客户端应用程序。我遇到的问题如下所述:

应用程序有一个自定义的登录表单。基于用户凭据,我执行一系列手动请求(“post”和“get”)以获取相关会话cookie

    ...
    //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: