Apache中的挂钩剖析(1)
日期:2007年8月25日 作者: 查看:[大字体 中字体 小字体]-
5.5 挂钩(HOOK)5.5.1 为什么引入挂钩在Apache1.3版本中,对HTTP请求的处理包括若干个固定阶段,比如地址转换阶段、身份确认阶段、身份认证阶段、权限确认阶段、MIME类型识别阶段等等,这也意味着Apache1.3中的挂钩数目是有限的,固定的。这个反映在模块结构中就是针对每个HOOK都对应一个函数指针。比如如果需要检查用户的身份是否合法则只需要调用ap_check_user_i;如果需要核查用户的权限是否满足则只需要调用auth_checker;而如果需要记录日志,则只需要调用logger函数即可。这种对请求的处理策略非常清晰明了。不过这种方法也有明显的局限性,首先就是所有的模块都维护所有的挂钩,但对于某个模块而言只有很少的几个挂钩会被使用,比如ap_check_user_id挂钩可能只有安全模块才用到,模块中不使用的挂钩都被置为NULL;最重要的问题是很难增加新的挂钩。如果需要增加一个新的挂钩,就必须修改module结构,这涉及到所有的模块的修改,工作量很大,而且需要重新进行编译,因此这种策略使得模块的扩展性能极差。为了使得Apache 2.0版本为了能够更具模块化,更具扩展性,apache采取了更加灵活的处理策略,即“模块自行管理”策略,即挂钩(Hooks)的概念,Hooks的使用使得函数从静态的变为动态的,模块编写者可以通过Hooks自行增加处理句柄,而不需要所有的模块都千篇一律。因此每次增加新函数,唯一必须修改的就是增加函数的模块而已。为了对挂钩有大体的了解,我们首先来看一下Apache2.0的HTTP请求处理流程。从大的方面来看,Apache对HTTP的请求可以分为连接、处理和断开连接三个阶段。从小的方面而言,每个阶段又可以分为更多的子阶段。比如对HTTP的请求,我们可以进一步划分为客户身份验证、客户权限认证、请求校验、URL重定向等阶段,每一个阶段调用相应的函数进行处理。在Apache中,这些子阶段可以用术语“挂钩(HOOK)”来描述。Apache中对请求的处理过程实质上就是依次调用一系列挂钩的过程,不过由于HTTP请求类型的不同,它们所对应的挂钩数目和类型也不尽相同。对于典型的HTTP请求,有一个默认的挂钩调用顺序,你可以按照这个默认的顺序进行调用,也可以不遵守这个顺序,你可以根据自己的情况调整调用顺序。整个HTTP的请求可以用下图来描述:
在上面的图示中,存在六种不同的挂钩,对于请求a,其指需要调用Hook2.、1;而对于请求b,则需要调用1、6、5;请求c则需要调用1、4、3、6四个挂钩。在Apache中,挂钩总是和挂钩函数联系在一起的。挂钩是用来表示在处理HTTP请求中一组类似的操作,与之对应,挂钩函数就是操作函数。不过即使挂钩相同,对应的挂钩函数也未必相同。举个简单的例子,配置文件模块和虚拟主机模块都需要身份验证挂钩来确认访问者能否访问相应的资源,但两个模块的验证方法则差别很大。因此一个挂钩同时是和一组挂钩函数联系在一起的。因此请求处理过程中,调用挂钩的时候实际上就是调用挂钩函数组。调用过程可以用下图示意。Apache对指定挂钩的挂钩函数调用有两种,一种就是将挂钩函数组中的每个函数都调用一次,比如图中的挂钩4;另一种就是从前往后调用,一旦找到合适的就停止继续调用,图中1、2、3就是这种情况。 - [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页
-
- Apache中的挂钩剖析(1) 相关文章:
- ·Apache中的挂钩剖析(1)
- ·C#+低级Windows API钩子拦截键盘输入
- ·钩子的应用: 程序运行监视
- ·低级键盘钩子屏蔽Win键、Alt+Tab键的响应
- ·使用全局鼠标钩子实现右键双击粘贴操作
- ·深入探讨.NET中的钩子技术
- ·挂钩Windows API
- ·书写NDIS过滤钩子驱动实现ip包过滤
- ·VB编程中钩子的实现及应用
- ·WINDOWS钩子函数
- Apache中的挂钩剖析(1) 相关软件
- ·铁钩船长(Hook)
- ·《铁钩船长》经典街机
- ·钩子船长
- ·中共往事钩沉之千秋功过(十大冤案)精品
- ·中共往事钩沉(2)——谁主沉浮
- ·中共往事钩沉之浪底真金-中共十大元老
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
下一篇:Apache中的文件与目录(1)
精品推荐
热点TOP10
- ·深入浅出.NET泛型编程
- ·如何为嵌入式开发建立交叉编译环境
- ·SVG与UML图详解
- ·使用ADS1.2进行嵌入式软件开发
- ·Linux 系统内核的调试
- ·UML类图详解(1)
- ·统一建模语言(UML)的现状及发展
- ·微软WCF给SOA带来的影响
- ·.NET 数据访问架构指南
- ·质量管理新七种工具简介(1)
- ·利用UML类图设计Java应用程序详解(1)
- ·Tomcat中用web.xml控制Web应用详解
- ·VC中利用多线程技术实现线程之间的通信
- ·WinCE嵌入式开发程序入门
- ·用WPF构建强大的用户体验
- ·ISO9000:2000 质量管理八大原则(1)
- ·掀起你的盖头来:WPF开发简介
- ·Apache APR可移植运行库简介(1)
- ·团队协作关键做好三件事&一个项目经理的一些个人体会
- ·质量意识概述
