QtWebApp同时开启http服务和https服务,接受来自客户端的不同请求并进行相应的处理

零、前言

在 QtWebApp开发https服务器,完成客户端与服务器基于ssl的双向认证,纯代码操作 一文中已经用纯代码的形式完成了客户端和服务端的 https 协议交互。
不过,只是开放了https服务,更多情况下,http服务和https服务都是同时开启的,,
客户端根据需求去决定究竟使用哪种协议进行连接交互操作
http服务的端口默认是80端口,https服务的端口默认是443端口。

开发环境:
客户端:win10
服务端:win10 + Qt6.4

一、思想

实际上非常简单,我们只需开启两个监听器就可以了,,分别用来处理http服务和https服务。
只需要在配置文件中分别指定http服务和https服务的配置参数,然后创建基于http服务器和基于https服务器,分别用来监听来自客户端的http请求和https请求。

注意:客户端http请求和https请求url中只是 协议和端口不同,其他都是一样的,
例如:
http://192.168.64.176:80/hello
https://192.168.64.176:443/hello
http的端口默认是80,https的端口默认是443,所以可以不写。
但是,如果http的端口设置为8888,那么请求时必须在请求url中显式指定8888端口;https同理。
用户不论以http请求,还是以https请求,当请求路径为 /hello时,在本例中它们都会跳转到 /hello对应的请求处理函数中执行相同的操作,只不过以http请求时,数据是以明文形式传输的;以https请求时,数据是以密文形式传输的。

二、代码

仍然以QtWebApp的demo1作为基点。
为简化,此处设置两个请求路径,分别是/hello和/hi路径,其他自带的请求路径及其处理函数全部屏蔽。

1、修改配置文件

在这里插入图片描述

[http_listener]
port=80

readTimeout=60000
maxRequestSize=16000
maxMultiPartSize=10000000

minThreads=4
maxThreads=100
cleanupInterval=60000


[https_listener]
port=443

readTimeout=60000
maxRequestSize=16000
maxMultiPartSize=10000000

minThreads=4
maxThreads=100
cleanupInterval=60000

...

2、请求路径处理函数
在这里插入图片描述

void HiController::service(HttpRequest &request, HttpResponse &response)
{
    response.setHeader("Content-Type", "text/html; charset=UTF-8");

    response.write("<html><body>");
    response.write("<h1 style=\"color:red;\">");
    response.write("HI~HI~HI~HI~HI~HI~HI~HI~HI~HI~HI~HI~HI~HI~HI~HI~HI~HI~HI~HI");
    response.write("</h1>");
    response.write("</body></html>",true);
}
void HelloController::service(HttpRequest &request, HttpResponse &response)
{
    response.setHeader("Content-Type", "text/html; charset=UTF-8");

    response.write("<html><body>");
    response.write("<h1 style=\"color:green;\">");
    response.write("HELLO~HELLO~HELLO~HELLO~HELLO~HELLO~HELLO~HELLO~HELLO~HELLO");
    response.write("</h1>");
    response.write("</body></html>",true);
}

3、添加路径映射
在这里插入图片描述

	// ...
    if (path.startsWith("/hi"))
    {
        HiController().service(request, response);
    }

    else if(path.startsWith("/hello")) {
        HelloController().service(request, response);
    }
	// ...

4、修改main函数
在这里插入图片描述

	// ...
	
    // Configure and start the TCP listener
    // http节点
    QSettings* listenerSettings1=new QSettings(configFileName, QSettings::IniFormat,&app);
    listenerSettings1->beginGroup("http_listener");

    // https节点
    QSettings* listenerSettings2=new QSettings(configFileName, QSettings::IniFormat,&app);
    listenerSettings2->beginGroup("https_listener");

    // 请求路径映射器: 拦截请求路径, 根据路径转入对应的后台处理函数
    // http服务和https服务共用同一个映射器
    RequestMapper* mapper = new RequestMapper(&app);

    // http服务监听器, 运行在80端口
    new HttpListener(listenerSettings1, mapper, &app);
    
    // https服务监听器, 运行在443端口
    new HttpListener(listenerSettings2, mapper, &app);
	
	// ...

QtWebApp源码通俗易懂,在实际操作时有问题直接阅读源码即可知道如何操作。。

三、测试效果

首先启动服务器,服务器分别监听80端口的http服务 和 443的端口https服务。
客户端输入 http://192.168.64.176/hello 是以http协议发出请求;
客户端输入 https://192.168.64.176/hello 是以https协议发出的请求;
请添加图片描述

好,下面通过抓包看一下,,
请添加图片描述

非常的明显,http协议是以明文传输 ,,我们直接通过wireshark就能拿到其传输的内容,其毫无隐私性可言
而https协议是以密文传输的,,同样可以通过抓包拿到,不过你拿到的也是密文,,,拿到了又如何,,反正你解不开,,这就是https加密传输。整个加解密过程由ssl自动完成,用户无需手手动干预
如果不加密传输,可以在内核层去拦截网络包,修改其内容后注入到原始网络路径中,,,这就造成极大的网络数据传输风险。。。
你们所使用的外挂其中的一个思想就是修改了网络数据包后再注入到原始路径中从而达到自己的目的,此处不再赘述。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/62252.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

奥威BI—数字化转型首选,以数据驱动企业发展

奥威BI系统BI方案可以迅速构建企业级大数据分析平台&#xff0c;可以将大量数据转化为直观、易于理解的图表和图形&#xff0c;推动和促进数字化转型的进程&#xff0c;帮助企业更好地了解自身的运营状况&#xff0c;及时发现问题并采取相应的措施&#xff0c;提高运营效率和质…

多线程(JavaEE初阶系列7)

目录 前言&#xff1a; 1.常见的锁策略 1.1乐观锁和悲观锁 1.2轻量级锁和重量级锁 1.3自旋锁和挂起等待锁 1.4互斥锁与读写锁 1.5可重入锁与不可重入锁 1.6公平锁与非公平锁 2.CAS 2.1什么是CAS 2.2自旋锁的实现 2.3原子类 3.synchronized 3.1synchronized的原理以…

解决Element Plus中Select在El Dialog里层级过低的问题(修改select选项框样式)

Element Plus是Vue.js的一套基于Element UI的组件库&#xff0c;提供了丰富的组件用于构建现代化的Web应用程序。其中&#xff0c;<el-select>是一个常用的下拉选择器组件&#xff0c;但在某些情况下&#xff0c;当<el-select>组件嵌套在<el-dialog>&#xf…

DP-GAN剩余代码

在前面计算完损失后&#xff0c;该进行更新&#xff1a; 1&#xff1a;netEMA是模型的生成器&#xff1a; 遍历生成器的state_dict&#xff0c;将每一个键对应的值乘以EMA_decay。 接着根据当前迭代步数计算num_upd&#xff0c;每1000,2500,10000代倍数就执行一次。 当num…

Spring(11) Bean的生命周期

目录 一、简介二、Bean的流程1.BeanDefinition2.Bean 的生命周期 三、代码验证1.User 实体类2.MyBeanPostProcessor 后置处理器3.SpringConfig 扫描包配置4.UserTest 测试类5.测试结果6.模拟AOP增强 一、简介 首先&#xff0c;为什么要学习 Spring 中 Bean 的生命周期呢&#…

【网络工程】网络流量分析工具 Wireshark

文章目录 第一章&#xff1a;WireShark介绍第二章&#xff1a;WireShark应用第三章&#xff1a;Wireshark 实战 第一章&#xff1a;WireShark介绍 Wireshark (前身 Ethereal)&#xff1a;它是一个强大的网络封包分析软件工具 ! 此工具使用WinPCAP作为接口&#xff0c;直接与网卡…

TiDB Serverless 正式商用,全托管的云服务带来数据管理和应用程序开发的全新体验

八 年 前 &#xff0c;我们构建了 TiDB&#xff0c;一个开源分布式关系型数据库。 我们的目标是重新定义开发者和企业处理数据的方式&#xff0c;满足不断增长的可扩展性、灵活性和性能需求。 从那时起&#xff0c;PingCAP 便致力于为开发者和企业提供快速、灵活和规模化的数据…

线性代数 | 机器学习数学基础

前言 线性代数&#xff08;linear algebra&#xff09;是关于向量空间和线性映射的一个数学分支。它包括对线、面和子空间的研究&#xff0c;同时也涉及到所有的向量空间的一般性质。 本文主要介绍机器学习中所用到的线性代数核心基础概念&#xff0c;供读者学习阶段查漏补缺…

Autosar通信入门系列05-聊聊一帧Can/CanFD报文发送时间?

本文框架 1. 概述2. 一帧CAN报文发送时间计算3. 一帧CanFD报文的传输时间计算3.1 标准CAN与CANFD两者间的区别3.2 CANFD报文传输时间计算 1. 概述 本篇我们一起看下一帧Can报文发送需要多长时间&#xff0c;下述文章里我们会首先计算下Can分别对应的字节数&#xff0c;再根据传…

Linux 下设置开机自启动的方法

文章目录 事先准备对于普通的 Linux对于 RedHat Enterprise Linux 9 笔者的运行环境&#xff1a; 设置成功过的 Linux&#xff1a; RedHat Enterprise Linux 9 x86_64 CentOS 8 x86_64 事先准备 进行这个教程之前&#xff0c;必须要先安装好一个 Linux 操作系统。这个 Linux…

C 语言高级3--函数指针回调函数,预处理,动态库的封装

目录 1.函数指针和回调函数 1.1 函数指针 1.1.1 函数类型 1.1.2 函数指针(指向函数的指针) 1.1.3 函数指针数组 1.1.4 函数指针做函数参数(回调函数) 2.预处理 2.1 预处理的基本概念 2.2 文件包含指令(#include) 2.2.1 文件包含处理 2.2.2 #incude<>和#include&q…

基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程

基于JenkinsPythonUbuntuDocker的接口/UI自动化测试环境部署详细过程 1 Jenkins是什么&#xff1f;2 Jenkins目标是什么&#xff1f;3 什么是CI/CD?3.1 CI持续集成3.2 CD持续部署3.3 CD持续交付 4 Ubuntu环境4.1 环境需求4.2 实现思路 5 Ubuntu下安装Docker6 安装Jenkins6.1 拉…

Linux Day06

目录 一、printf输出问题 二、复制进程fork 2.1进程 2.2 pid_t fork(void); 注意&#xff1a; 2.3逻辑地址和物理地址 2.4写时拷贝技术 一、printf输出问题 printf 函数并不会直接将数据输出到屏幕&#xff0c;而是先放到缓冲区中&#xff0c;只有一下三种情况满 足&a…

24考研数据结构-第五章:树与二叉树

目录 第五章&#xff1a;树5.1树的基本概念5.1.1树的定义5.1.2 基本术语5.1.3 树的性质 5.2二叉树的概念5.2.1 二叉树的定义与特性5.2.2 几种特殊的二叉树5.2.3 二叉树的性质5.2.4 完全二叉树的性质5.2.5 二叉树的存储结构1. 顺序存储重要的基本操作非完全二叉树2. 链式存储逆向…

【Paper】2020_网络化多智能体系统的事件触发一致性研究_徐勇

徐勇. 网络化多智能体系统的事件触发一致性研究[D].浙江大学,2020.DOI:10.27461/d.cnki.gzjdx.2020.001385. 文章目录 5 已知 DoS 攻击策略下多智能体系统的事件触发安全一致性分析5.1 引言5.2 数学模型与问题描述5.3 控制器和事件触发条件的设计5.5 数值仿真程序 Main.m程序 M…

使用FreeMarker导出word文档(支持导出图片)

今天跟大家分享一下工作中比较实用的导出word 带图片的功能。 对于在idea开发中我们需要引入以下依赖&#xff1a; 2.对于eclipse 开发我们需要进入对应的jar包 这个必须放在lib下&#xff0c;同样也需要在当前项目的环境是加入该依赖 需要在MEAT-INF加入 首先制定word 导出…

UE5 半透明覆层材质

文章目录 前言介绍示例1示例2示例3 前言 本文采用虚幻5.2.1版本演示&#xff0c;介绍半透明覆层材质&#xff08;覆层材质&#xff09;。 介绍 半透明覆层材质是 UE5.1 版本 更新的功能&#xff0c;使用半透明覆层材质&#xff0c;可以轻松的给物体表面附着一层材质。 在UE5…

Python3 处理PDF之PyMuPDF 入门

PyMuPDF 简介 PyMuPDF是一个用于处理PDF文件的Python库&#xff0c;它提供了丰富的功能来操作、分析和转换PDF文档。这个库的设计目标是提供一个简单易用的API,使得开发者能够轻松地在Python程序中实现PDF文件的各种操作。 PyMuPDF的主要特点如下&#xff1a; 跨平台兼容性&a…

Aspose.Imaging for Python via .NET Crack

Aspose.Imaging for Python via .NET Crack Aspose.Imaging for Python via.NET是一个提供高级图像处理功能的库。您可以使用此API轻松创建、加载、操作、转换或压缩图像。另外&#xff0c;Aspose.Imaging for Python通过.NET支持绘图和使用图形基元。图像导出和转换-API的核心…