使用ISAPI过滤器增强IIS的功能

2016-01-29 18:43 25 1 收藏

使用ISAPI过滤器增强IIS的功能,使用ISAPI过滤器增强IIS的功能

【 tulaoshi.com - ASP 】

 

作为一个WWW服务器软件,微软公司的Internet Infomation Server(IIS)简单易学,管理方便,得到了广泛的使用。您还可以通过ISAPI过滤器,进行自己定制的处理,来增强IIS的功能。ISAPI过滤器可以定制以下的处理:接收HTTP协议头预处理、发送HTTP协议头预处理、发送生数据预处理、获得生数据预处理、HTTP会话结束信息处理、自定义的安全认证机制、URL映射信息处理、日志记录处理等。灵活利用这些定制处理,您可以完成许多看似难以实现的功能,得到意想不到的效果。但是ISAPI过滤器使用不当也会影响服务器的性能。


ISAPI过滤器的开发非常简单,只需要完成三个接口DLL函数即可。它们是GetFilterVersion()、HttpFilterProc()、TerminateFilter(),大家可以查看MSDN了解详细的用法。ISAPI过滤器是DLL文件,一般用C/C++语言开发。为使ISAPI过滤器能够运行,您需要在注册表的HKEY_LOCAL_MACHINESystemCurrentControlSet
ServicesW3SVCParameters下建立一个字符串项,其名称为"Filter Dlls",值为ISAPI过滤器文件的全路径名称。若这个字符串项已经存在,只需把它的全路径名称加入其中,不同的ISAPI过滤器文件之间用";"分隔,您可以根据执行的优先顺序加在适当的位置。设置好后重新启动IIS服务,您的ISAPI过滤器就发挥作用了。

下面作者举一个具体的应用例子。

对访问内容进行统计分析:
通常我们在需要计数的页面内放一个计数器,或者使用ASP文件来实现计数功能。这种方法不能适用于如README.TXT等其他非HTML格式的文件。如果使用IIS的日志功能又太占用空间而不方便。作者通过定制URL映射信息处理来跟踪感兴趣的几个文件的计数统计,将结果记录在一个文件中。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/asp/)

下面是它的源程序。

fcount.def:
LIBRARY fcount
EXPORTS GetFilterVersion
 HttpFilterProc
 TerminateFilter

fcount.c:
#include <stdio.h
#include <string.h
#include <windows.h
#include <httpfilt.h

#define logfile "C:InetPubfcount.log"
#define pages 5
char* urls[] = {
  "/default.htm",
  "/banner.gif",
  "/product/readme.txt",
  "/product/product1.htm",
  "/product/product2.htm"
  };
int counts[pages];

BOOL WINAPI GetFilterVersion
(HTTP_FILTER_VERSION *pVer)
{
int i;

 pVer-dwFilterVersion = HTTP_FILTER_REVISION;
strcpy(pVer-lpszFilterDesc, "fcount");
 pVer-dwFlags = SF_NOTIFY_URL_MAP; /* 过滤的内容 */

 for (i=0; i<pages; i++) { /* 从文件读入初始计数值 */
counts[i] = GetPrivateProfileInt("VisitCounter",
urls[i],
0, logfile);
}

 return TRUE;
}

DWORD WINAPI HttpFilterProc
(HTTP_FILTER_CONTEXT *pfc,
 DWORD noteType, VOID *pvNote)
{
 int i;
 char lurl[512];
 char buf[16];

 strcpy(lurl, ((PHTTP_FILTER_URL_MAP)pvNote)
-pszURL);
 _strlwr(lurl);
 for (i=0; i<pages; i++) {
 if (strcmp(lurl, urls[i])==0) {
  counts[i] ++; /* 计数值增加 */
  if (counts[i]%10==0) {
/* 当计数值满10时记入文件,
 以免系统突然死掉时数据全部丢失 */
  _itoa(counts[i], buf, 10);
  WritePrivateProfileString("VisitCounter",
 urls[i], buf, logfile);
  }
  break;
 }
 }
 return SF_STATUS_REQ_NEXT_NOTIFICATION;
}

BOOL WINAPI TerminateFilter(DWORD dwFlags)
{
 int i;
 char buf[16];

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/asp/)

 for (i=0; i<pages; i++) {
    /* 系统停止时将计数值写入文件 */
 _itoa(counts[i], buf, 10);
 WritePrivateProfileString("VisitCounter",
 urls[i], buf, logfile);
 }
 return TRUE;
}

以上二个例子作者使用VC 6.0编译,在WINNT2000 + SP3 和 IIS 5.0上调试通过。

 

来源:https://www.tulaoshi.com/n/20160129/1507014.html

延伸阅读
过滤器可以在请求到达jsp或Servlet之前或响应返回客户端之前添加一些额外的操作。假如有多个JSP页面和Servlet都需要进行一个相同或相似的操作,我们可以把这个操作抽取到一个Servlet过滤器中,并通过匹配路径截获感爱好JSP或Servlet。 我们举几个典型的过滤器应用的例子,读者可以推而广之: ·编码转换 乱码...
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.colorchooser.*; /**  * pTitle: 颜色选择器/p  * pDescription: 演示一个颜色选择器,可以从样本中选择,可以使用HSB模式和RGB模式/p  * pCopyright: Copyright (c) 2003/p  * pFilename: ColorChoos...
用于溢流  在鱼缸一侧18厘米处安排一块宽高是52*52的玻璃,用于溢流,两边和下部用玻璃胶粘牢;玻璃左下角上打一孔,位置与水泵进水口持平。 用于阻水   在溢流玻璃的外侧3cm处安排一块宽高52*40的玻璃,用于阻水,两侧用玻璃胶粘牢;下部留出8.5厘米,用于配置格栅。 胶水粘牢 当阻水玻璃沾牢后,在其上下各沾一个格栅。...
标签: 生活常识
水族箱如何正确安装过滤器   鱼缸的过滤器如果没有好好放置的话,还是会出现鱼缸水浑浊的情况,所以如何安装过滤器是非常重要的。我为你总结了两个过滤器的放置方法,一起来看一下吧。 一、基本方法 1、泵装合适形成循环,不留粪便就是最好的检验。 2、泵的瓦数比常规大一点吸水量大,加速循环。 3、滤棉厚...
标签: Web开发
CSS过滤器(filter)是一种对特定的浏览器或浏览器组显示或隐藏规则或声明的方法。过滤器根据浏览器中的缺陷,比如解析bug以及未实现或错误地实现的CSS,对浏览器显示或隐藏规则。 CSS招数是一种让浏览器表现得符合自己希望的不优雅的方法。CSS招数通常用来解决特定的浏览器bug,比如IE的专有框模型。不幸的是,招数(hack)这个词有比较强的...

经验教程

432

收藏

46
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部