需求:
客户端二次认证获取手机验证码,会遭受漏洞攻击,需要在之前添加图形验证码校验,先调取图形验证码接口;
实例:
QByteArray imageData = reply->readAll();
QPixmap pixmap;
pixmap.loadFromData(imageData);
功能描述:
图形验证码接口有两种形式,一种是通过通用的Json格式下发QString类型的数据,一种是简单直接的网络格式QByteArray数据;
1、Json数据
数据做了base64转码
QNetworkCookie GetCotrllSessionid;
QNetworkReply::NetworkError err = networkGet(url,retMsg,LoginSessionid,GetCotrllSessionid);
QString dataJsonObject;
qint32 status;
if (err == QNetworkReply::NoError)
{
QJsonParseError parseJsonErr;
QJsonDocument documentMessage = QJsonDocument::fromJson(retMsg.toUtf8(),&parseJsonErr);
if (parseJsonErr.error != QJsonParseError::NoError)
{
return;
}
QJsonObject jsonObject = documentMessage.object();
status = jsonObject["code"].toString().toInt();
dataJsonObject = jsonObject["data"].toString();
}
else
{
return;
}
if(status != ENAPP_CALL_CONTROLLER_API_NO_ERROR)
{
return;
}
QString imageData;//接收到服务器的base64数据是string类型
imageData = dataJsonObject;
QPixmap image;
bool pic = image.loadFromData(QByteArray::fromBase64(imageData.toLocal8Bit()));
if(!pic)
{
errorInfoShow(tr("验证码加载失败,请点击重试。"), true);
return;
}
2、QByteArray数据
QUrl url("https://example.com/image.jpg");
QNetworkAccessManager manager;
QNetworkReply *reply = manager.get(QNetworkRequest(url));
QObject::connect(reply, &QNetworkReply::finished, [=]() {
if (reply->error() != QNetworkReply::NoError) {
// 处理请求错误
return;
}
QByteArray imageData = reply->readAll();
QPixmap pixmap;
pixmap.loadFromData(imageData);
// 或者 QImage image = QImage::fromData(imageData);
// 处理图像数据
});
定义一个QLabel图标,显示图形验证码
QLabel *plabelPicCode;
imageData.scaled(plabelPicCode->size(), Qt::KeepAspectRatio);//设置图片大小
plabelPicCode->setScaledContents(true);
plabelPicCode->setPixmap(imageData);
3、添加cookie
接口访问需要通过cookie认证
QNetworkCookieJar* pCookieJar = new QNetworkCookieJar;
pCookieJar->insertCookie(strPic.mSecCookieSessionID);
netAccessManager.setCookieJar(pCookieJar);