社区
Windows SDK/API
帖子详情
用DELPHI如何编写ISAPI过滤器(IIS)
xflcx
2002-06-11 08:04:07
谁能告送我isapi2的详细用法。我主要是想实现对ASP文件加密,通过ISAPI过滤器还原
...全文
122
13
打赏
收藏
用DELPHI如何编写ISAPI过滤器(IIS)
谁能告送我isapi2的详细用法。我主要是想实现对ASP文件加密,通过ISAPI过滤器还原
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xflcx
2002-07-20
打赏
举报
回复
每人能帮我吗?高手呢
xflcx
2002-06-27
打赏
举报
回复
这个例子我也有,代码不全,能提供一个更全的吗?分全给你
Sterntaler
2002-06-21
打赏
举报
回复
我首先说明, 我不是高手, 这篇文章我还没有仔细看过, 因为我还没有这种必要, 也没有时间来看我还用不着的东西, 正在为一个医院管理系统忙得要命.
不够详细是吧? 老兄自己去搜索好么, 我就只能提供这么多了. 先忙去了.
Sterntaler
2002-06-21
打赏
举报
回复
技术性的文章应该自己去找啊! 搜索一下不是挺好的么? 既然还没有结贴, 给你找到一个, 看看合适不? 不合适再找一个. 反正不是很费时间(相对于编码或者自己写文章), 是 Hubdog 收集的:
用delphi编写ISAPI过滤器
实 现WEB 站 点 同 时 对GB 码 和BIG 码 的 支 持
--------------------------------------------------------------------
---- 目 前 由 于 汉 字 内 码 的 不 统 一, 互 联 网 上 的 中 文 站 点 为 了 实 现 对 于 不 同 用 户 的 支 持, 一 般 采 取 建 立 两 套 主 页, 分 别 用GB 和BIG 码 来 编 写。 这 样 做 显 然 要 增 加 站 点 的 维 护 工 作, 更 新 主 页 时 要 同 时 更 新 两 部 分。 而 且 如 果 主 页 内 容 是 实 时 更 新 的, 采 用 手 工 维 护 两 套 主 页 的 方 法 显 然 不 行 了。 本 文 介 绍 了 用ISAPI 过 滤 器 来 动 态 产 生 另 外 一 套 内 码 主 页 的 方 法, 这 样 就 可 以 只 制 作 一 套 主 页 就 同 时 支 持GB 码 和BIG5 码。
---- 基 本 的 思 路, 编 写 一 个ISAPI 过 滤 器, 对 于 所 有 最 终 返 回 给 用 户 的HTML 文 本, 实 行 内 码 转 换。 这 样 用 户 看 到 的 将 是 他 期 望 的 编 码 方 式。 ISAPI 过 滤 器 可 以 作 为WEB Server 横 向 功 能 扩 展。 当 某 个 预 先 定 义 好
---- 的 服 务 器 端 的 事 件 发 生 时,IIS 就 调 用 用 户 定 义 好 的 过 程, 此 时 就 可 以 通 过 修 改IIS 传 来 的 数 据 来 改 变IIS 的 行 为。IIS 预 定 义 的 事 件 如 下:
SF_NOTIFY_READ_RAW_DATA
---- 当IIS 要 从 用 户 读 入 数 据 时 发 生。 过 滤 器 可 以 在IIS 处 理 他 们 之 前 检 查 甚 至 修 改 用 户 输 入 的 原 始 数 据。
---- SF_NOTIFY_PREPROC_HEADERS
---- IIS 预 处 理HTTP 请 求 包 头 后 发 生。 过 滤 器 可 以 检 查 修 改 增 加 包 头。
---- SF_NOTIFY_AUTHENTICATION
---- IIS 试 图 验 证 用 户 身 份 时 发 生。 过 滤 器 可 以 实 现 自 己 的 验 证 方 案。
---- SF_NOTIFY_URL_MAP
---- IIS 试 图 将URL 解 释 为 物 理 文 件 时。 过 滤 器 可 以 将 请 求 重 定 向 到 其 他 的 文 件。
---- SF_NOTIFY_ACCESS_DENIED
---- 当 身 份 验 证 失 败 时 发 生。
---- SF_NOTIFY_SEND_RAW_DATA
---- 当 其 他 程 序 处 理 完,IIS 准 备 将 数 据 发 回 给 用 户 时 发 生。 我 们 的 过 滤 器 就 通 过 此 事 件, 转 换 内 码。
---- SF_NOTIFY_LOG
---- 当IIS 写 记 录 到LOG 文 件 时。 过 滤 器 可 以 搜 集 更 多 的 信 息 写 入 记 录 文 件 中。
---- SF_NOTIFY_END_OF_REQUEST
---- 当 一 个HTTP 请 求 结 束 时 发 生。 过 滤 器 可 以 实 现 基 于 请 求 的 处 理。 由 于 这 是 在IIS 3.0 中 新 增 的,Delphi 中 的ISAPI2.pass 单 元 中 没 有 相 应 的 定 义 可 以 手 工 加 入SF_NOTIFY_END_OF_REQUEST=$80
---- SF_NOTIFY_END_OF_NET_SESSION
---- 连 接 结 束 时。 注 意 如 果 浏 览 器 支 持"keep-alive", 一 次 连 接 可 能 包 含 几 个HTTP 请 求。 过 滤 器 可 以 用 他 来 释 放 一 些 用 户 的 资 源。
---- 我 们 要 实 现 动 态 的 内 码 转 换, 只 要 过 滤 器 处 理SF_NOTIFY_SEND_RAW_DATA 事 件, 将IIS 处 理 好 的 数 据 转 换 成 需 要 的 内 码 就 可 以 实 现 内 码 的 动 态 转 换。 具 体 程 序 有 两 个 问 题 需 要 注 意:
过 滤 器 只 能 处 理 返 回 是HTML 格 式 的, 其 他 图 片 等 二 进 制 请 求 无 须 也 不 允 许 转 换。
对 于 返 回 的HTML, 只 处 理 实 际 数 据, 其 他HTTP 协 议 的 包 不 应 该 处 理。
编 程
---- 每 个ISAPI 过 滤 器DLL 必 须 输 出 两 个 供IIS 使 用 的 函 数:
---- GetFilterVersion() 和HttpFilterProc()。 下 面 分 别 讲 述。
---- GetFilterVersion()
---- 用 于 初 始 化 和 处 理 事 件 的 登 记。 例 程 没 有 初 始 工 作 要 做, 只 是 简 单 的 登 记 了 要 处 理 的 两 个 事 件 和 其 他 一 些 标 志。
function GetFilterVersion(var pVer:
THTTP_FILTER_VERSION): BOOL; stdcall;
begin
//过滤器要处理的事件和其他一些标志
pVer.dwFlags := (
SF_NOTIFY_NONSECURE_PORT
//过滤器只在一般端口上使用
or SF_NOTIFY_SEND_RAW_DATA
//处理发送数据事件
or $80 // SF_NOTIFY_END_OF_REQUEST
处理请求结束事件
or SF_NOTIFY_ORDER_DEFAULT
//过滤器使用缺省优先级
);
//过滤器使用的版本HTTP_FILTER_REVISION
返回当前版本
pVer.dwFilterVersion := HTTP_FILTER_REVISION;
//过滤器的描述
pVer.lpszFilterDesc[0]:='A'; pVer.lpszFilterDesc[1]:=#0;
result:=true; //初始化成功
end;
HttpFilterProc()
---- 由IIS 回 调, 是 过 滤 器 的 实 际 处 理 部 分。
---- 其 中 参 数Notificationtype 是 该 调 用 的 事 件 类 型, 如 果 过 滤 器 处 理 多 个 事 件, 可 以 检 查 该 值 来 区 分 事 件。
---- PvNotification 是 一 个 根 据 事 件 类 型 可 变 结 构 的 参 数。 对 于SF_NOTIFY_SEND_RAW_DATA, 他 的 结 构 如 下:
THTTP_FILTER_RAW_DATA = record
pvInData: Pointer; //指向数据区
cbInData: DWORD; //数据大小
cbInBuffer: DWORD; //缓冲的大小
dwReserved: DWORD; //保留
end;
---- 其 中 的pvInData 就 是 要 发 送 的 数 据 指 针。 其 他 的 结 构 请 参 看 有 关 资 料 这 里 不 再 详 述。
---- 第 一 个 参 数var pfc: THTTP_FILTER_CONTEXT 是 过 滤 器 的 环 境 指 针, 其 中 的pFilterContext 是 一 个 用 户 使 用 的 指 针, 用 来 保 存 和 一 个HTTP 连 接 相 关 的 信 息, 这 样 过 滤 器 可 以 区 分 出 正 在 处 理 的 是 否 是 以 前 曾 处 理 过 的 连 接。 因 为 一 个 请 求 将 会 产 生 多 个SF_NOTIFY_SEND_RAW_DATA 事 件, 过 滤 器 必 须 能 够 区 分 他 们。
---- 程 序 的 流 程 是: 当 连 接 建 立 后,pFilterContext 被IIS 初 始 化 为NIL(0), 第 一 次SF_NOTIFY_SEND_RAW_DATA 调 用 时, 过 滤 器 要 检 查 返 回 的MIME, 如 果 不 是HTML 则 将pFilterContext 置 为pointer(2)( 将 指 针 当 作 变 量 用, 因 为 我 们 只 要 一 个 标 志), 随 后 的 发 送 事 件 调 用 将 直 接 返 回。 请 求 结 束 后, 发 生SF_NOTIFY_END_OF_REQUEST 事 件, 过 滤 程 序 将pFilterContext 复 位 为nil。
---- 如 果 是HTML, 则 将pFilterContext 置 为pointer(1), 随 后 的 调 用 就 将 对 数 据 进 行 内 码 的 转 换, 然 后 将pFilterContext 置 为pointer(3)。 如 果 还 有 后 续 的 调 用, 则 再 将pFilterContext 置 为pointer(1), 直 到 全 部 数 据 发 送 完 成。
function HttpFilterProc(var pfc: THTTP_FILTER_CONTEXT;
Notificationtype: DWORD; pvNotification: Pointer): DWORD; stdcall;
var
p:PHTTP_FILTER_RAW_DATA;
i:integer;
pc:pchar;
begin
if Notificationtype=$80 then
//是SF_NOTIFY_END_OF_REQUEST将pFilterContext复位
begin
pfc.pFilterContext:=nil;
end
else
begin
p:=PHTTP_FILTER_RAW_DATA(pvNotification);
pc:=p^.pvInData;
case integer(pfc.pFilterContext) of
0: //第一次调用,要检查MIME
begin
pfc.pFilterContext:=pointer(2);
i:=0;
while i
----
下 面 是 完 整 的 程 序 文 件(gb2bigfiler.dpr), 其 中 的u_gb2big_tab 单 元 完 成GB 码 到BIG5, 码 的 转 换, 这 里 不 再 细 述, 有 兴 趣 的 读 者 可 以 到 后 文 提 到 的 笔 者 的 站 点 去 下 载 源 码。
library gb2bigfiler;
uses
SysUtils,math, Classes, windows,
isapi2, //delphi中ISAPI过滤器单元
u_gb2big_tab; //包含将GB码转换成BIG5码的过程gb2big
//下面两个函数的定义见上文
function HttpFilterProc(...); begin ... end;
function GetFilterVersion(...); begin ... end;
exports
HttpFilterProc index 1, GetFilterVersion index 2;
Begin end.
---- 读 者 一 定 注 意 到 了, 这 个 过 滤 器 将 所 有 返 回 的HTML 都 转 换 成 了BIG5 码, 那 么GB 码 又 如 何 看 到 呢 ? 当 然 可 以 在 过 滤 器 中 检 查 一 些 环 境 变 量 来 决 定 用 户 所 要 求 的 是GB 还 是BIG5, 可 是 这 样 做 除 了 比 较 麻 烦 外, 还 存 在 效 率 问 题, 因 为 每 个 请 求 都 要 被 过 滤 器 处 理。
---- 笔 者 采 用 的 方 法 是 利 用IIS4.0 中 可 以 设 置 多 个 站 点 的 功 能, 设 置 两 个 站 点。 一 个 不 含 过 滤 器, 所 以GB 内 容 高 效 直 接 的 返 回 给GB 用 户; 而 另 一 个 站 点 使 用 另 外 一 个 端 口 比 如81, 所 有 虚 拟 目 录 和 前 一 个 站 点 一 样, 将 过 滤 器 加 载 在 该 站 点 上, 这 样 所 有 向81 端 口 的 请 求, 都 将 被 过 滤 器 转 换 成BIG5 码 返 回 给 用 户。
---- 下 面 简 述 一 下 具 体 配 置 过 程。 首 先 在delphi 中 选 择 新 建 一 个DLL, 输 入 程 序 源 码, 编 译 后 生 成gb2bigfiler.DLL 文 件。 在IIS4.0 的 管 理 控 制 台 中, 选" 新 建 站 点", 主 目 录 和 缺 省 站 点 一 样, 端 口 设 为81, 在ISAPI 过 滤 器 中 选 择" 添 加", 将gb2bigfiler.DLL 加 入。
---- 设 置 好 后, 可 以 浏 览81 端 口( 例 如:http://www.yoursite.com:81/your.html), 这 时 原 来GB 码 的 内 容 就 变 成 了BIG5 码 了。
---- 有 兴 趣 的 读 者 可 以 访
xflcx
2002-06-19
打赏
举报
回复
高手出招吧。分都给你
烟灰
2002-06-16
打赏
举报
回复
关注
daehappy
2002-06-16
打赏
举报
回复
up!关注!
xflcx
2002-06-16
打赏
举报
回复
如何编写ISAPI过滤器
mingyeh
2002-06-15
打赏
举报
回复
加密解密可以考虑用Turbo Power的LockBox控件
newnewworm
2002-06-15
打赏
举报
回复
IntraBob是资深程序员Dr.Bob编写的免费工具软件,用于测试Delphi编写
的CGI/WinCGI/ISAPI程序,它可以代替PWS/IIS等WWW服务器软件,
调试本地的CGI/WinCGI/ISAPI程序,其原理是模拟PWS/IIS接受WWW请求,
并根据您的设置将类似于“http://www.123.com/testisapi.dll”
的远程URL映射到本地文件,如“d:\intrabob\demo\TestISAPI.dll”。
IntraBob目前的版本为5.0,支持调试Delphi3 -4 C/S、Delphi 5 Pro/Enterprise、
C++Builder3-4 C/S中的WebModules,同时全面支持WebBroker技术和Delphi5
中的InternetExpress。
可以从http://www2.drbob42.com/drbob42/intrabob.zip下载IntraBob5.0软件及
演示文件,IntraBob.zip文件解压缩后有六个文件,各个文件用途如下:
Debug.dll:ISAPI程序,用于演示IntraBob的调试功能。
Debug.dpr:ISAPI程序,Debug.dll的源代码,用于演示IntraBob的调试功能。
Drbob42.zip:Internet组件,CRC、CRC32、SMTP、 POP3、FTP。
Home.htm:调用演示ISAPI程序Debug.dll的HTML 页面文件。它是IntraBob程序启
动时调用的默认页面。
Intrabob.exe:IntraBob程序,用来调试CGI/ WinCGI/ISAPI程序。
Readme:IntraBob程序功能介绍及使用方法。
下面以IntraBob5.0和Delphi3.0为例介绍用 IntraBob调试CGI/WinCGI/ISAPI程序
的方法。我们将用Delphi3.0编写一个简单的ISAPI 程序来演示IntraBob的用法。
假设IntraBob5.0被解压缩到文件夹“d:\intrabob\”下,被调试的ISAPI位于文件夹
“d:\intrabob\demo\”下。
一、调用页面
首先,我们需要一个页面,该页面用于调用要调试的 ISAPI程序并向其传递参数,
它要求用户输入姓名、性别、省份,用户提交后将这三个参数给
http://www.123.com/testisapi.dll用于显示。
该页面存为 “D:\INTRABOB\demo\testisapi.htm”,其HTML代码如下:
< HTML >
< HEAD >
< TITLE >用IntraBob调试ISAPI< /TITLE >
< /HEAD >
< BODY >
< H2 >用IntraBob调试ISAPI< /H2 >
< HR >
< FORM ACTION=“http://www.123.com/
testisapi.dll" METHOD=“POST" >
< br >姓名:< INPUT TYPE=“text" NAME=“Name"
SIZE=“40" value=‘王发军' >
< br >性别:< INPUT TYPE=“radio"
NAME=“Sex"value=‘男' checked>男
< INPUT TYPE=“radio"NAME=“Sex" value=‘女' >女
< br >省份:< Select Name=Province >< Option >河南
< /Option >< Option >河北< /Option >< /Select >
< br >< INPUT TYPE=“SUBMIT" VALUE=“提交测试ISAPI" >
< INPUT TYPE=“RESET" VALUE=“重新填写" >
< /FORM >
< /BODY >
< /HTML >
二、编写ISAPI程序
然后,我们用Delphi3.0编写一个简单的ISAPI程序,接受姓名、性别、省份三个
参数并将其显示出来。
(1)建立一个Web Server Application工程文件,选择“ISAPI/NSAPI Dynamic
Link Library”;
(2)在WebModule1中增加一个WebActionItem1,在其OnAction事件中写下如下代码:
procedure TWebModule1.WebModule1WebActionItem1Action
(Sender: TObject;Request: TWebRequest; Response:
TWebResponse; var Handled: Boolean);
var
Name,Sex,Province : string;
begin
Name := Request.ContentFields.values[‘name'];
Sex := Request.ContentFields.values[‘Sex'];
Province := Request.ContentFields.values[‘Province'];
Response.Content := ‘
您的输入如下:';
Response.Content := Response.Content + ‘
姓名:' + name;
Response.Content := Response.Content + ‘
性别:' + sex;
Response.Content := Response.Content + ‘
省份:' + Province;
Response.Content := Response.Content + ‘';
end;
(3)将程序存到文件夹“d:\intrabob\demo\”下,命名工程文件为TestISAPI.dpr。
(4)用Ctrl+F9编译确保无语法错误,并生成ISAPI 程序文件TestISAPI.DLL。
三、用IntraBob5.0调试ISAPI程序
1. 设置ISAPI工程文件运行参数
将IntraBob.exe设置为TestISAPI.dpr的Host Application。在“Run”菜单下的“
Parameters...”中,将Host Application设置为 “D:\INTRABOB\Intrabob.exe”,
如下图所示:
另外,用F5在程序中设置一个断点,用于演示 IntraBob的调试功能。
2.开始ISAPI程序调试
用F9开始运行程序TestISAPI.DLL,IntraBob.exe 将随之启动,并会调用其默认页
面“D:\INTRABOB\HOME.HTM”,在IntraBob.exe调用的IE 控件的地址栏输入我们的调试
页面地址“D:\INTRABOB\demo\testisapi.htm”,可显示页面,如下图所示:
3.设置IntraBob选项,调试ISAPI程序
为了用IntraBob调试ISAPI程序,还需要设置 IntraBob选项,主要是将远程URL映
射到本地文件,也就是将 “http://www.123.com/testisapi.dll”的远程URL映射到
本地文件 “d:\intrabob\demo\TestISAPI.dll”。选择“Options”页,IntraBob
已经从显示的页面中提取出远程URL“http://www.123.com/testisapi.dll”,并填入
“Remote URL”栏,我们只需要将“Local App”栏指定为“d:\intrabob\demo\TestISAPI.dll”即可。然后回到 “Browser”页,在测试页面中点击“提交测试ISAPI”按钮来提交已输入的数据。此后,Delphi IDE的代码窗口被激活,我们会看到程序已运行到刚才设置的断点处,我们就可以开始像调试普通应用程序一样调试ISAPI程序了,剩下的就是Delphi程序调试技巧问题了。将ISAPI 运行到结束,IntraBob将输出结果以“D:\INTRABOB\output.htm”的形式显示在“Browser” 页中。由于IntraBob显示HTML页面时用的是微软提供的IE控件,我们可以用鼠标右键来选择“后退”、 “刷新”、“查看源代码”等功能。
四、注意事项
(1)如果在“Browser”窗口中刷新调试页面,IntraBob 选项将恢复为默认设置,
此时可能需要在“Options”页中重新设置ISAPI的路径即重新设置“Local App”的值。
否则可能出现类似“TerminateExtension crashed in testisapi.dll” 的错误。
(2)IntraBob5.0不接受48K以上的提交数据。
有了IntraBob这个工具软件,我们在本机上调试 CGI/WinCGI/ISAPI程序就不
必安装PWS或IIS了,同时也不用频繁启动和停止PWS/ⅡS、甚至重新启动计算机了。
以上操作和程序在PWin98 + Delphi3.0 C/S + IntraBob5.0 + IE4.0及PWinNT4.0
+ Delphi3.0 C/S + IntraBob5.0 + IE5.0下测试通过。
njbudong
2002-06-13
打赏
举报
回复
我不懂,负责灌水,,,,
xflcx
2002-06-11
打赏
举报
回复
高手出招吧!!
Sterntaler
2002-06-11
打赏
举报
回复
http://delphibbs.com/delphibbs/dispq.asp?lid=139920
用
delphi
编写
I
SAP
I
过滤器
====================================================== 注:本文源代码点此下载 ...用
delphi
编写
i
sap
i
过滤器
实 现web 站 点 同 时 对gb 码 和big 码 的 支 持 ---- 目 前 由 于 汉 字 内
使用I
SAP
I
过滤器
开发来增强
IIS
的功能
您还可以通过I
SAP
I
过滤器
,进行自己定制的处理,来增强
IIS
的功能。I
SAP
I
过滤器
可以定制以下的处理:接收HTTP协议头预处理、发送HTTP协议头预处理、发送生数据预处理、获得生数据预处理、HTTP会话结束信息处理、...
用
Delphi
开发I
SAP
I
过滤器
以增强
IIS
功能
实 现WEB 站 点 同 时 对GB 码 和BIG 码 的 支 持目 前 由 于 汉 字 内 码 的 不 统 一, 互 联 网 上 的 中 文 站 点 为 了 实 现 对 于 不 同 用 户 的 支 持, 一 般 采 取 建 立 两 套 主 页, 分 别 用GB 和BIG...
[转]
delphi
IIS
I
SAP
I
目前由于汉字内码的不统一,互联网上的中文站点为了实现对于不同用户的支持,一般采取建立两套主页,分别用GB和BIG码来
编写
。这样做显然要增加站点的维护工作,更新主页时要同时更新两部分。而且如果主页内容是实时...
为 I
SAP
I DLL 配置 Windows 7
IIS
7
转自:...Windows 7
IIS
7 需要一些配置才能使 I
SAP
I DLL 正常工作。与
IIS
5 相比,它并不是那么简单。 安装
IIS
7 转到控制面板 |程序和功能 |打开或关闭 Windows 功能(需要特权模式)。 ..
Windows SDK/API
1,183
社区成员
22,335
社区内容
发帖
与我相关
我的任务
Windows SDK/API
Delphi Windows SDK/API
复制链接
扫一扫
分享
社区描述
Delphi Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章