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

news2024/12/28 10:36:55

零、前言

在 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自动完成,用户无需手手动干预
如果不加密传输,可以在内核层去拦截网络包,修改其内容后注入到原始网络路径中,,,这就造成极大的网络数据传输风险。。。
你们所使用的外挂其中的一个思想就是修改了网络数据包后再注入到原始路径中从而达到自己的目的,此处不再赘述。。。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决 Android Studio 的 Gradle 面板上只有关于测试的 task

文章目录 问题描述解决办法 笔者出问题时的运行环境&#xff1a; Android Studio Flamingo | 2022.2.1 Android SDK 33 Gradle 8.0.1 JDK 17 问题描述 笔者最近发现一个奇怪的事情。笔者的 Android Studio 的 Gradle 面板上居然除了用于测试的 task 之外&#xff0c;其它什…

Spring Security6入门及自定义登录

一、前言 Spring Security已经更新到了6.x,通过本专栏记录以下Spring Security6学习过程&#xff0c;当然大家可参考Spring Security5专栏对比学习 Spring Security5专栏地址&#xff1a;security5 Spring Security是spring家族产品中的一个安全框架&#xff0c;核心功能包括…

驱动工作原理

驱动原理 在Linux操作系统中&#xff0c;硬件驱动程序中实现对硬件直接操作&#xff0c;而用户空间&#xff0c;通过通用的系统调用接口&#xff08;open() 打开相应的驱动设备,ioctl()控制相应的功能等&#xff09;&#xff0c;实现对硬件操作&#xff0c;应用程序没有直接操作…

百度Apollo规划算法——OBB障碍物检测代码解析

百度Apollo规划算法——Box障碍物检测代码解析 前言代码代码分析f1f2f3f4f5f6 参考 前言 本文主要分析Apollo代码中函数bool Box::HasOverlap(const Box2d &box) const {}的数学原理。 在阅读此部分代码时&#xff0c;第一遍没看懂return的一堆什么意思&#xff0c;百度之后…

work weekly

每周汇报&#xff1a;围绕着项目范围及需求内容完成情况多少、人力资源情况、整体进度情况、成本情况、【范围】多少工作、【资源】投入多少人、【时间】花费多少时间、【成本】花了多少钱 【质量】一般没有特别要求的默认软件开发过程规范要求响应时间 【沟通】这里不说了 …

31 对集合中的字符串,按照长度降序排列

思路&#xff1a;使用集合的sort方法&#xff0c;新建一个Comparator接口&#xff0c;泛型是<String>&#xff0c;重写里面的compare方法。 package jiang.com; import java.util.Arrays; import java.util.Comparator; import java.util.List;public class Practice4 {…

ppt压缩文件怎么压缩最小?文件压缩技巧分享

在日常的工作和学习中&#xff0c;难免会遇到PPT太大&#xff0c;需要将其压缩变小的情况&#xff0c;但很多朋友还不知道怎么压缩PPT文件&#xff0c;下面就给大家分享几个简单的方法&#xff0c;分分钟缩小过大的PPT文件。 一、PowerPoint PowerPoint就是微软公司的演示文稿…

微信小程序的自定义TabBar及Vant的使用

一、安装Vant 1、在 资源管理器 空白位置&#xff0c;点右键打开 在外部终端窗口打开 2、初始化NPM npm init -y 3、安装命令 npm i vant/weapp1.3.3 -S --production 4、构建NPM包 在 工具 里选择构建NPM包 5、删除style:v2 在app.json里&#xff0c;删除"style"…

【中断机制】什么是中断?使用中断的原因、注意事项

目录 一、为什么需要中断 二、什么是中断 1、中断的概念 2、中断的分类 3、中断的处理流程 三、中断处理程序要少用延时的原因 一、为什么需要中断 以网卡为例&#xff0c;CPU 如果要从网卡获取数据&#xff0c;不可能时时盯着网卡啥时候会有数据。当网卡收到数据时&…

炼钢工艺流程(2)

1. 轧制单元 更换前后两个工作辊之间的轧制对象称为轧制单元&#xff0c;对应一个轧制计划。两个 支撑辊之间的轧制对象是由多个轧制单元组成&#xff0c;称为轧制单元组&#xff0c;对应多个轧制计 划。 轧制单元的结构 每个计划开始的部分板坯按照宽度非减的方向排列来加热轧…

Linux中安装Node

安装 先从 官方网站 下载安装包&#xff0c;有时 node 版本太新会导致失败&#xff0c;详见下方的常见问题第2点 cd /home // 创建目录&#xff0c;将下载好的 node 安装包上传到此目录 mkdir Download mkdir /usr/local/lib/node解压 // 解压&#xff0c;前面是文件当前路径…

jenkins pipeline项目

回到目录 将练习jenkins使用pipeline项目&#xff0c;结合k8s发布一个简单的springboot项目 前提&#xff1a;jenkins的环境和k8s环境都已经安装完成&#xff0c;提前准备了gitlab和一个简单的springboot项目 创建一个流水线项目 流水线中选择git&#xff0c;并选择gitlab的…

运放电路之比较器的分析笔记

一、比较器 比较器分为同相比较器和反相比较器。 反相比较器电路如下&#xff1a; V11为固定值&#xff0c;这里设定的是2.5V&#xff0c;接到了运放的输入正&#xff08;V&#xff09;&#xff1b; V10为输入值&#xff0c;值可变&#xff0c;接到了运放的输入负&#xff08;V…

Python 开发工具 Pycharm —— 使用技巧Lv.2

pydoc是python自带的一个文档生成工具&#xff0c;使用pydoc可以很方便的查看类和方法结构 本文主要介绍&#xff1a;1.查看文档的方法、2.html文档说明、3.注释方法、 一、查看文档的方法 **方法1&#xff1a;**启动本地服务&#xff0c;在web上查看文档 命令【python3 -m…

人工智能编程软件 python,python人工智能编程入门

大家好&#xff0c;给大家分享一下人工智能python编程具体做什么&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 有不少同学学习 Python 的原因是对人工智能感兴趣&#xff0c;有志于从事相关行业。今天我们来聊聊这个方向所需要的一些技能…

一条sql语句在mysql中如何执行(查询+更新)

文章目录 一 MySQL 基础架构1.1 MySQL 基本架构1.2 Server 层基本组件介绍1) 连接器2) 查询缓存(MySQL 8.0 版本后移除)3) 分析器4) 优化器5) 执行器 二 语句分析2.1 查询语句2.2 更新语句为什么要用两个日志模块&#xff0c;用一个日志模块不行吗?为什么必须有“两阶段提交”…

基于Java+SpringBoot+SpringCloud+Vue的智慧养老平台设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

框架的前置学习-反射

运行java代码要经历的三个阶段 反射&#xff0c;程序框架设计的灵魂&#xff0c;将类的各个组成部分封装成其他对象&#xff0c;这就是反射机制。 框架&#xff1a;半成品的软件&#xff0c;在框架的基础上进行开发&#xff0c;可以简化编码 反射的好处&#xff1a; 可以在…

通过easyui实现动态控制表格字段显示、导出表格数据

前言 学过layui前端框架的都知道&#xff0c;layui默认帮我们实现了控制表格字段显示以及数据的导出功能。 1、控制表格字段显示 2、数据导出 3、导出为pdf&#xff1a;导出按钮的右边那个按钮就是打印pdf的 那么&#xff0c;easyui要怎么实现这些功能呢&#xff1f;这篇文章就…

matlab计算基础

目录 1. 创建矩阵和向量 2. 矩阵的基本运算 2.1 数乘 2.2 转秩 2.3 求逆 2.4 点积 2.5 拼接 3. 复数 4. 矩阵元素的引用 5.工作区中数据的保存和使用 1. 创建矩阵和向量 向量包括行向量和列向量&#xff0c;向量就是个特殊的矩阵&#xff0c;向量可看作C语言中的一维…