1:问题说明
当我们在网址输入栏输入http://www.baidu.com/ 能够进入百度首页,但是当我们跳转到百度首页的时候,会发现网址输入栏已然变成了https://www.baidu.com/。这是因为在这个过程中其实百度给我们做了重定向的操作,由于http协议在传输过程中可能会被第三方获取信息,部署HTTPS加密是防止流量劫持基本、重要的安全措施!
补充:
- HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
- HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
2:用QT实现重定向整个过程
2.1:需要用到的头文件
#include<QNetworkAccessManager> //它用来发送网络请求和接收应答。
#include<QNetworkReply> //包含了发送给QNetworkAccessManager请求的所有应答数据且一个顺序访问的QIODevice
#include<QNetworkRequest> //包含着在网络上发送请求的必要信息
2.2:演示过程
首先,我们先建一个QT程序,窗口使用mainwindow即可,然后我们再mainwindow.cpp中去写我们的代码。
利用QT程序去模拟用户访问http://www.baidu.com:80这个过程,看看百度那边给我们重定向传来的数据是什么。 所有注释和代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QNetworkAccessManager>
#include<QNetworkReply>
#include<QNetworkRequest>
#include<QDebug> //用于测试打印
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//需要一个manager对象,用于发送get、post请求
QNetworkAccessManager* manager = new QNetworkAccessManager(this); //this的好处是当前窗口被释放,manager也会被释放
//准备工作---初始化一个QNetworkRequest,因为post函数会用到这个参数
QNetworkRequest res;
//设置请求头---浏览器 第二个参数可以去浏览器的开发工具上看
res.setHeader(QNetworkRequest::UserAgentHeader,
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38");
res.setUrl(QUrl("http://www.baidu.com:80"));
//发送请求
QNetworkReply* reply = manager->get(res); //get(res) post(res,"")
//读服务器回写的数据
connect(reply,&QNetworkReply::readyRead,this,[=](){
//读数据
QVariant str = reply->header(QNetworkRequest::LocationHeader); //如果浏览器做了重定向操作,那么服务器回写的数据会返回给请求头,reply->header的返回值是万能类型
QByteArray data = reply->readAll();
qDebug()<<data;
qDebug()<<str.toString();
});
}
MainWindow::~MainWindow()
{
delete ui;
}
当我们使用get请求时,服务器回写的数据如下图所示:
当我们使用post请求时,服务器回写的数据如下图所示:
最后,觉得本文内容对你有所帮助的话,希望能点赞收藏,你的鼓励是对我最大的支持!