一、简述
1.互联网公司的c/s架构都是通过网络请求或者浏览器界面访问服务端来完成数据的展示和交换。
2.客户端依据账户密码链接服务端进行身份验证。
3.身份验证成功之后服务端都会在客户端回写cookies。
4.QNetworkAccessManager利用QNetworkCookieJar进行cookies的管理,QNetworkAccessManager的所有请求都会使用其内部的QNetworkCookieJar
5.如果想利用QWebEngineView访问需要鉴权的网址,例如淘宝,京东等等需要登录的界面。此时需要将上述cookies共享到QWebEngineView中。具体方法如下:
QWebEngineView::QWebEnginePage::QWebEngineProfile::cookieStore::setCookie(const QNetworkCookie &cookie, const QUrl &origin = QUrl());即为将要访问的url添加鉴权cookies
二、子类化CookieJar代码
#ifndef COOKIEJAR_H
#define COOKIEJAR_H
#include <QObject>
#include <QNetworkCookie>
#include <QDebug>
#include <QNetworkCookieJar>
#define pre true
#define prd true
//使用QNetworkAccessManager访问网络时,需要管理Cookie信息。
//Qt的QNetworkCookieJar类实现了一个简单的Cookie容器,但它只在内存中保留Cookie,该类的对象一旦被删除,里面的cookies也被丢弃。
//如果想存储在本地,必须继承该类然后自己实现存储。
class CookieJar : public QNetworkCookieJar
{
public:
explicit CookieJar(QObject *parent = nullptr);
~CookieJar();
void setCookies(const QList<QNetworkCookie> &cookieList);
QList<QNetworkCookie> getCookies() const;
void modifyCookies();
};
#endif // COOKIEJAR_H
#include "cookiejar.h"
CookieJar::~CookieJar()
{
}
void CookieJar::setCookies(const QList<QNetworkCookie> &cookieList)
{
return setAllCookies(cookieList);
}
QList<QNetworkCookie> CookieJar::getCookies() const
{
return allCookies();
}
void CookieJar::modifyCookies()
{
QList<QNetworkCookie> cookieList = getCookies();
for(int i=0;i<cookieList.size();i++){
//配置cookie域名
if(pre){
cookieList.at(i).domain() = QString("pre");
}
else if(prd){
cookieList.at(i).domain() = QString("prd");
}
//配置鉴权的cookie键值对
if(cookieList.at(i).name() == QByteArray("auth0")){
cookieList.at(i).value() = QByteArray("value0");
}
if(cookieList.at(i).name() == QByteArray("auth1")){
cookieList.at(i).value() = QByteArray("value1");
}
}
setCookies(cookieList);
}
三、说明
网络请求携带的cookie以及响应返回的cookie都可以用Fiddler软件抓包进行查看。
Fiddler软件https://www.cnblogs.com/yyhh/p/5140852.html
具体配置请参看https://blog.csdn.net/u010906468/article/details/104747464