http://bk.chinaar.com/index.php?edition-view-75-1
CHttpFilter
CHttpFilter没有基类。
CHttpFilter与CHttpFilterContext一起,创建并管理超文本传输协议(HTTP)过滤器对象。一个HTTP过滤器是一个可替换的动态链接库(DLL),服务器对任意HTTP请求调用。当过滤器被装载时,它向服务器说明了它对何种通知感兴趣。此后,无论何种选择的事件发生,过滤器就被调用并提供执行事件的条件。
ISAPI (Internet Server API)过滤器功能极强,有以下应用:
1.定制的鉴定策略
2.压缩
3.加密
4.登录
5.流量分析或其它分析
可安装多个过滤器。通知次序基于由过滤器确定的优先级及任意联系的登录的装载命令。可查看滤器的文档,看看如何安装过滤器。
注意:
一旦过滤器开始执行一个请求,则不管是对文件还是ISAPI应用,它都将接收数据。
过滤器应用于面向客户的网络连接和HTTP服务器之间。依赖于过滤器所选择的选项,它可以参与多种服务器活动,包括从客户机读取原始数据、处理头、通过安全端口通信(PCT——个人通信技术,SSL——安全套接字子层,以及其它)、或者HTTP请求处理的一些其它阶段。
设置过滤器所用的过滤器通知,请参阅 GetFilterVersion。
要了解有关Internet 过滤器的更多信息,请参阅联机文档“Visual C++程序员指南”中的“ISAPI扩展:过滤器”。至于用ISAPI Extension Wizard创建Internet过滤器,请参阅联机文档“Visual C++程序员指南”中的“构造一个典型的ISAPI过滤器”。
#include <afxisapi.h>
CHttpFilter类的成员
构造函数
CHttpFilter | 构造一个CHttpFilter对象 |
属性
GetFilterVersion | 在CHttpFilter对象被构造后,得到过滤器的版本 |
可覆盖的函数
OnReadRawData | 允许查阅原始数据。返回的数据将包含标题和数据 |
OnPreprocHeaders | 提示客户:服务器已预处理过客户标题 |
OnAuthentication | 鉴定客户OnUrlMap当服务器正将一个逻辑URL映射到物理路径上时,提醒客户 |
OnSendRawData | 从服务器发送原始数据到客户机 |
OnLog | 向服务器文件登录信息 |
OnEndOfNetSession | 提示客户,进程结束 |
操作
HttpFilterProc | 返回消息,指示通过过滤器的事件如何被执行。发生一个事件就调用一次 |
CHttpFilter::CHttpFilter
CHttpFilter( );
说明:
在构造一个CHttpFilter对象的过程中,成员函数被框架调用。
CHttpFilter::GetFilterVersion
virtual BOOL GetFilterVersion( PHTTP_FILTER_VERSION pVer );
返回值:
如果过滤器装载正常,则为非零。如果过滤器返回0,那么此过滤器未被装入,不能接收任何通知。
参数:
pVer | 一个指向HTTP_FILTER_VERSION结构的指针,此结构包含服务器的版本信息及过滤器的字段,用于指明版本号和通知。此过滤器应用还包括登录其自身描述的空间。缺省实现时,以下两个标记设置在结构中:
|
说明:
此成员函数被Internet服务器调用,以获得pVer指示的过滤器版本。
在CHttpFilter对象被构造后,它只能调用一次。
使用dwFlags来确定你的服务器感兴趣的pVer成员的通知。下面是dwFlags有效标记的列表:
· | SF_NOTIFY_ORDER_DEFAULT | 在缺省优先级下装载过滤器。推荐使用该值,因为其它优先级通知对性能和调节有很大的影响。 |
· | SF_NOTIFY_ORDER_LOW | 以低的优先级装载过滤器。 |
· | SF_NOTIFY_ORDER_MEDIUM | 以中等优先级装载过滤器。 |
· | SF_NOTIFY_ORDER_HIGH | 以高的优先级装载过滤器。 |
· | SF_NOTIFY_SECURE_PORT | 提示此应用正通过一个安全端口传送数据。 |
· | SF_NOTIFY_NONSECURE_PORT | 提示此应用正通过一个不安全的端口传送数据。 注意: 当设置的既不是SF_NOTIFY_NONSECURE_PORT又不是SF_NOTIFY_SECURE _PORT时,服务器将两个均作为缺省值,允许通过任何端口处理数据。 |
· | SF_NOTIFY_READ_RAW_DATA | 允许查阅原始数据。返回给客户的数据将同时包含标题和数据。 |
· | SF_NOTIFY_PREPROC_HEADERS | 服务器已预处理了标题。 |
· | SF_NOTIFY_AUTHENTICATION | 服务器鉴定客户。 |
· | SF_NOTIFY_URL_MAP | 服务器将逻辑URL映射为物理路径。 |
· | SF_NOTIFY_SEND_RAW_DATA | 服务器正给客户机发回数据。 |
· | SF_NOTIFY_LOG | 服务器正往服务器日志中写信息。 |
· | SF_NOTIFY_END_OF_NET_SESSION | 与客户的会话完毕。 |
CHttpFilter::HttpFilterProc
virtual DWORD HttpFilterProc( PHTTP_FILTER_CONTEXT pfc, DWORD NotificationType, LPVOID pvNotification );
返回值:
指示此应用对事件的处理,由一个dwFlags值表示;请参阅GetFilterVersion的说明,以了解这些值的列表。
参数:
pfc | 一个指向HTTP_FILTER_CONTEXT结构的指针。此参数指向的该HTTP_FILTER_CONTEXT结构包含与上下文的信息。该pfc结构的成员可被过滤器使用,以把任意的上下文的信息与HTTP请求合并。SF_NOTIFY_END_OF_NET_SESSION 通知可被用于释放任何这样的上下文信息。 | |||||||||||||||||||||
NotificationType | 标识正被处理的事件类型。有效类型列在GetFilterVersion中。 | |||||||||||||||||||||
pvNotification | 一个通知指定的结构。
|
说明:
每次通过过滤器时,此成员函数被框架调用来处理数据。HttpFilterProc是否调用适当的CHttpFilter成员函数,取决于指定的通知类型。例如,HttpFilterProc将调用OnPreprocHeaders,如果通知类型为SF_NOTIFY_PREPROC_HEADERS。
HttpFilterProc是ISAPI过滤器进行核心工作的地方。pvNotification指向的各种结构 (列在上面表格中)包含指向这些操作的数据和函数指针。请参阅此结构的细节,以进一步了解数据是如何被HttpFilterProc结构处理的。
可覆盖单个处理(列在上面表格中),以改变数据在相关结构中被处理的方式。
CHttpFilter::OnAuthentication
virtual DWORD OnAuthentication (CHttpFilterContext* pfc, PHTTP_FILTER_AUTHENT pAuthent );
返回值:
以下通知类型中的一个:
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求,服务器应释放会话连接。 |
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED相同,除了当选项已协商好时,服务器应保持TCP会话打开。 |
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。 |
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。 |
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。 |
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个不透明的流过滤器;协商会话参数。只对原始可读通知有效。 |
参数:
pfc | 一个CHttpFilterContext对象,包含上下文的信息。CHttpFilterContext对象可被过滤器使用,以将上下文的信息与HTTP 请求合并。 |
pAuthent | 一个指向HTTP_FILTER_AUTHENT结构的指针。 |
说明:
此成员函数被框架调用以鉴定客户。
覆盖此成员函数以实现你自己的鉴定。缺省实现什么也不做。
CHttpFilter::OnEndOfNetSession
virtual DWORD OnEndOfNetSession( CHttpFilterContext* pfc );
返回值:
以下通知类型中的一个:
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求,服务器应释放会话连接。 |
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED 相同,除了当选项已协商好时,服务器应保持TCP会话打开。 |
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。 |
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。 |
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。 |
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个不透明的流过滤器,协商会话参数。只对原始可读通知有效。如果未成功,则应返回通知类型SF_STATUS_REQ_ERROR。此时,服务器应使用Windows函数SetLastError并向客户指出错误。 |
参数:
pfc | 一个CHttpFilterContext对象,包含上下文的信息。CHttpFilterContext对象可被过滤器使用,以将上下文的信息与HTTP请求合并。 |
说明:
此成员函数被框架调用,以通知客户会话结束。
覆盖此成员函数以实现你自己的会话结束。缺省实现什么也不做。
CHttpFilter::OnLog
virtual DWORD OnLog( CHttpFilterContext* pfc, PHTTP_FILTER_LOG pLog );
返回值:
以下通知类型中的一个:
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求,服务器应释放会话连接。 |
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED 相同,除了当选项已协商好时,服务器应保持TCP会话打开。 |
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。 |
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。 |
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。 |
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个不透明的流过滤器,协商会话参数。只对原始可读通知有效。如果未成功,则应返回通知类型SF_STATUS_REQ_ERROR。此时,服务器应使用Windows函数SetLastError并向客户指出错误。 |
参数:
pfc | 一个CHttpFilterContext对象,包含上下文的信息。CHttpFilterContext对象可被过滤器使用,以将上下文的信息与HTTP请求合并。 |
pLog | 一个指向HTTP_FILTER_LOG结构的指针。 |
说明:
此成员函数被框架调用以在服务器写信息到服务器日志中时通知过滤器。
覆盖此成员函数以提供你自己的向服务器文件中记录日志信息的方法。缺省实现什么也不做。
CHttpFilter::OnPreprocHeaders
virtual DWORD OnPreprocHeaders(CHttpFilterContext* pfc, PHTTP_FILTER_PREPROC_HEADERS pHeaders);
返回值:
以下通知类型中的一个:
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求,服务器应释放会话连接。 |
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED 相同,除了当选项已协商好时,服务器应保持TCP会话打开。 |
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。 |
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。 |
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。 |
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个不透明的流过滤器,协商会话参数。只对原始可读通知有效。 如果未成功,则应返回通知类型SF_STATUS_REQ_ERROR。此时,服务器应使用Windows函数SetLastError并向客户指出错误。 |
参数:
pfc | 一个CHttpFilterContext对象,包含上下文的信息。CHttpFilterContext对象可被过滤器使用,以将上下文的信息与HTTP请求合并。 |
pHeaders | 一个指向HTTP_FILTER_PREPROC_HEADERS结构的指针。 |
说明:
此成员函数被框架调用,以通知客户服务器已预处理了客户标题。
覆盖此成员函数以提供你自己的处理客户标题的方法。缺省实现什么也不做。
CHttpFilter::OnReadRawData
virtual DWORD OnReadRawData( CHttpFilterContext* pfc, PHTTP_FILTER_RAW_DATA pRawData );
返回值:
以下通知类型中的一个:
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求,服务器应释放会话连接。 |
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED 相同,除了当选项已协商好时,服务器应保持TCP会话打开。 |
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。 |
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。 |
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。 |
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个非透明的流过滤器,协商会话参数。只对原始可读通知有效。 如果未成功,则应返回通知类型SF_STATUS_REQ_ERROR。此时,服务器应使用Windows函数SetLastError并向客户指出错误。 |
参数:
pfc | 一个CHttpFilterContext对象,包含上下文的信息。CHttpFilterContext对象可被过滤器使用,以将上下文的信息与HTTP请求合并。 |
pRawData | 一个指向HTTP_FILTER_RAW_DATA结构的指针。 |
说明:
此成员函数被框架调用以允许查阅原始数据。
覆盖此成员函数以另外处理原始数据。缺省实现什么也不做。
CHttpFilter::OnSendRawData
virtual DWORD OnSendRawData( CHttpFilterContext* pfc, PHTTP_FILTER_RAW_DATA pRawData );
返回值:
如果成功,则返回通知类型SF_STATUS_REQ_NEXT_NOTIFICATION。调用通知链表中的下一个过滤器。
如果未成功,则应返回通知类型SF_STATUS_REQ_ERROR。此时,服务器应使用Windows函数SetLastError 并向客户指出错误。
参数:
pfc | 一个CHttpFilterContext对象,包含上下文的信息。CHttpFilterContext对象可被过滤器使用,以将上下文的信息与HTTP请求合并。SF_NOTIFY_END_ OF_NET_SESSION可被用于释放任何此类上下文信息。 |
pRawData | 一个指向HTTP_FILTER_RAW_DATA结构的指针。 |
说明:
此成员函数被框架调用,以通知客户服务器正发送原始数据给客户。覆盖此成员函数,只用于改变HttpFilterProc使用的缺省通知处理和另外处理原始数据。
CHttpFilter::OnUrlMap
virtual DWORD OnUrlMap( CHttpFilterContext* pfc, PHTTP_FILTER_URL_MAP pUrlMap );
返回值:
以下通知类型中的一个:
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求,服务器应释放会话连接。 |
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED相同,除了当选项已协商好时,服务器应保持TCP会话打开。 |
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。 |
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。 |
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。 |
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个非透明的过滤器,协商会话参数。只对原始可读通知有效。 如果未成功,则应返回通知类型SF_STATUS_REQ_ERROR。此时,服务器应使用Windows函数SetLastError,并向客户指出错误。 |
参数:
pfc | 一个CHttpFilterContext对象,包含上下文的信息。CHttpFilterContext对象可被过滤器使用,以将上下文的信息与HTTP请求合并。 |
pUrlMap | 一个指向HTTP_FILTER_URL_MAP结构的指针。 |
说明:
当服务器将URL映射到物理路径时,此成员函数被框架调用。
覆盖此成员函数以另外处理URL映射。缺省实现什么也不做。