apache编程思想--挂钩(HOOK)

2023-11-03

      如果让你自己编写一个web服务器你会怎么设计,我曾经使用java语言实现了一个最简单的web服务器,我的做法是应用一个socket类启用去监听一个特定的端口,并根据http协议标准去解析这样一个长串:POST /reg.jsp HTTP/ (CRLF) ,我所做的只是将/reg.jsp截取下来,然后在本地的机器上找到这个文件,并根据“状态行、消息报头、响应正文”的响应报文格式返回给浏览器, 当然,一个真正的web服务器还要去解析Accept、HOST、Content-Length、Connection等字段,在这我们不去讨论这方面内容,我们继续来研究web服务器最主要的功能--解析请求串POST /reg.jsp HTTP/ (CRLF),当时我还沾沾自喜认为一个服务器原来有这么简单(设计思想上的简单,只需要加一些逻辑判断来适应复杂的http请求),可是当我看到了apache的源代码,并花了很长的时间研究了它的原理,我才发现我的程序是多么地单薄。
      继续我上面的例子,如果我想改变web服务器的端口,我肯定不能去修改源代码,因为这样拓展性就太差了,这时就要用到配置文件来动态地设置端口号,一般的web服务器都会有十几二十个配置文件,应用配置文件就会在启动服务器之前来定制我想要的功能,当然,这也不是我想要说的主要问题。
      应用配置文件后我的服务器的扩展性大大增强了,可是又一个需求来了,就是如果一个从浏览器发送过来的请求是加密的话,我要根据他传过来的密钥进行解密。这就需要我们在服务器接受请求时增加一段代码(类或函数)来处理这一过程,具体加密解密在这我们也不讨论,我们只讨论如何通过配置文件来调用这一过程。
      一般地,我们会在配置文件中添加诸如ssl_engine = true(名字可以自己起)这样的信息点来告诉服务器,服务器加载配置文件时就会知道要不要启动这一功能,好了需求说完了,可是我们要怎么设计呢,一个想法就是在主程序读取配置文件后通过if-else语句来判断,如果是true则在if()内执行解密代码,当然,这是一种非常糟糕的实现,拓展性极差而且执行效率会很低,如果一个配置文件有几百个信息点,如何实现主程序真是无法想象。

      作为世界使用排名第一的Web服务器软件,让我们看看apache是如何实现的,apache引入了挂钩的概念,什么是挂钩呢,从大的方面来看,Apache对HTTP的请求可以分为连接、处理和断开连接三个阶段;从小的方面而言,每个阶段又可以分为更多的子阶段。比如对HTTP的请求,我们可以进一步划分为客户身份验证、客户权限认证、请求校验等阶段,每一个阶段调用相应的函数进行处理。在Apache中,这些子阶段可以用术语“挂钩(HOOK)”来描述。也就是说你就可以把挂钩理解为一个处理过程,在上面的例子中,你完全可以把解密过程看做是一个挂钩的实现。
      按照apache的设计思想,我把我的web服务器细化为三大部分,第一部分是处理请求前挂钩,第二部分是处理请求挂钩,第三部分是后续挂钩,其中的每一个部分挂钩可以看做是抽象的,他们本身并不会完成什么功能,但在每一个部分挂钩中我们都维护一个类似于List的数据结构,在这个List中则是真正地各种挂钩的实现。我可以把上面的解密过程注册(对于java程序就是在List或队列中进行接口回调)到第一部分挂钩中,当主程序运行到这个挂钩时,就会遍历这个List,找到注册在里面的解密代码,就可以进行相应地处理了。
      这就是apache的精髓之一,整个服务器程序的扩展性极高,每一个模块和每一个特殊功能都可以独立出来并通过挂钩再整合到服务器上。   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

apache编程思想--挂钩(HOOK) 的相关文章

随机推荐

  • 深度学习自学第二周:基于keras实现猫狗大战

    目录 一 初步实现 一 选取训练集 测试集 验证集 二 构建神经网络模型 三 数据预处理 四 绘制损失曲线和精度曲线 二 优化模型 三 数据测试 结合之前学习的知识 现在可以进行猫狗大战的实现了 数据集是采用猫狗大战kaggle竞赛提供的2
  • 三句话,让Ai帮你画18万张图

    本文介绍Stable Diffusion的快速上手 本地部署 以及更多有趣的玩法展示 在 DALL E 2 和 Imagen 之后 AI绘图领域又一个热乎的深度学习模型出炉 Stable Diffusion 8月份发布的 Stable Di
  • Python 异常的传递性

    视频版教程 Python3零基础7天入门实战视频教程 异常是具有传递性的 假如方法A调用方法B 方法B调用方法C 如果方法C代码出现异常 并且没有处理异常 则会传递给方法B 同理 如果B依然没有处理异常 则最终传递给方法A def funC
  • FPGA边缘检测(上升沿、下降沿、双边沿)的三种实现方案

    边缘检测在数字电路设计中非常常见 通常包含上升沿检测 posedge 下降沿检测 negedge 以及双边沿检测 double edge 边缘检测虽然实现非常简单 但有一些值得注意的地方 在设计中一不留神可能就会出现边沿漏检的情况 下面结合
  • 小波理论的基本概念及概述 学习笔记

    本文来自 https blog csdn net seek97 article details 81266223 感谢前辈的分析和总结 下文我做了简要的修改 一 前言 欢迎阅读此份关于小波变换的入门教程 小波变换是一个相对较新的概念 其出现
  • SpringBoot+Nacos:@RefreshScope自动刷新原理

    RefreshScope的作用 经过 RefreshScope注解修饰的bean 将被RefreshScope进行代理 用来实现配置 实例热加载 即当配置变更时可以在不重启应用的前提下刷新bean中相关的属性值 RefreshScope注解
  • 超有趣的linux命令2

    超有趣的linux命令2 此次实验命令均在Ubuntu16 04版本上测试 注意有些命令需要在图形化界面才能显示效果 温馨提示 可能有人是第一次接触Ubuntu 所以下面详细写了如何配置源和网络 以及安装命令的方式 1 首先配置软件源 以命
  • 快手直播间如何引流?快手直播推广怎么玩?

    快手是一个超好玩的短视频社区 每时每刻都有来自世界各地的小伙伴在这里分享自己制作的短视频 现在的快手不仅可以制造短视频 还拥有了直播的功能 那么快手直播效果好吗 快手直播效果好吗 快手发展优势日益明显 快手的用户已经超过5亿之多了 日均活跃
  • 批处理IF-ELSE的使用

    IF Performs conditional processing in batch programs 在批程序中执行条件处理 IF NOT ERRORLEVEL number command IF NOT string1 string2
  • [python爬虫] 招聘信息定时系统 (一).BeautifulSoup爬取信息并存储MySQL

    这系列文章主要讲述 如何通过Python爬取招聘信息 且爬取的日期为当前天的 同时将爬取的内容保存到数据库中 然后制作定时系统每天执行爬取 最后是Python调用相关库发送短信到手机 最近研究了数据库的定时计划备份 联系爬虫简单做了这个实验
  • AdaptFormer: Adapting Vision Transformers for Scalable Visual Recognition

    Motivation ViTs 在视觉识别领域取得了巨大成功 后续需要使 ViT 适应各种图像和视频识别任务 由于计算量大 存储空间大 自适应具有一定的挑战性 每个模型都需要一个独立而完整的微调过程来适应不同的任务 这限制了它在不同视觉域的
  • 攻防世界-web-进阶-php_rce

    题目描述 无 附件 无 过程及思路 打开在线场景 是一个关于ThinkPHP的页面 看起来没什么特别的 几个链接点进去也都是正常的官方链接 我们尝试到github搜索ThinkPHP V5 发现有相关的 远程代码执行 漏洞集合 RCE 远程
  • HTTP协议,Request、Response学习与使用

    目录 HTTP 概念 特点 历史版本 请求消息数据格式 1 请求行 2 请求头 3 请求空行 4 请求体 正文 响应消息数据格式 1 响应行 2 响应头 3 响应空行 4 响应体 响应字符串格式 Request对象 1 request对象和
  • Jmeter函数助手之CSVRead _

    一 函数助手调用 启动jmeter界面后 可以在JMeter的选项菜单中找到函数助手对话框 快捷键 Ctrl Shift F1 如下图所示 打开函数助手后 可从下拉列表中选择需要的函数 并为其参数设定值 不同的函数要求的参数也不同 函数参数
  • 解决Could not find a version that satisfies the requirement XXX问题

    开发环境 本人用的是windows10专业版 Python3 8 解决办法 在用户 user 目录下新建文件夹pip 并在pip文件夹下创建pip ini配置文件 pip文件夹下不能直接创建文件 建议在桌面创建好之后复制到pip文件夹下 p
  • unity学习之怪物名称血条

    欢迎来到unity学习 unity培训 unity企业培训教育专区 这里有很多U3D资源 U3D培训视频 我们致力于打造业内unity3d培训 学习第一品牌 人物的名称与血条的绘制方法很简单 但是我们需要解决的问题是如何在3D世界中寻找合适
  • JVM调优工具总结(jConsole jmc jvisualvm)

    一 环境准备 centos7服务器一台 安装jdk1 8 一个可运行java的jar包 最好是有个服务器运维工具 我用的是宝塔面板 主要是用来开放端口 当然你是用命令开放也可以的 本地win10上安装jdk1 8 二 启动 1 将jar包放
  • 最易懂得 鸿蒙 实战 - 真机调试 原子服务

    升级到3 0 ide后 增加一些sdk 更新速度还是很快 广告也开始鸿蒙标识了 看来华为大动作很快 另外 体验了华为m6的超级终端 还是被震撼一下 速度上 性能上确实是万物互联的感觉 鸿蒙的动态效果 确实有点自己独有味道 但是缺少独特性 反
  • 前馈神经网络(一 神经元)

    声明 本文是博主在学习前馈神经网络时的笔记 仅供学术交流 非商用 内容可能涉及一些大佬的资料 包含网上电子的和实体书籍等 由于学习工程中查阅的资料多而杂 所以每一部分具体的参考资料并没有详细对应 如有侵权 还望海涵 并联系博主删除 本人才疏
  • apache编程思想--挂钩(HOOK)

    如果让你自己编写一个web服务器你会怎么设计 我曾经使用java语言实现了一个最简单的web服务器 我的做法是应用一个socket类启用去监听一个特定的端口 并根据http协议标准去解析这样一个长串 POST reg jsp HTTP CR