前段时间,公司打算自行开发能够跨j2ee以及.net的单点登录平台,需要一个无侵入式的工具,来拦截所有经过iis的http请求(.net框架的拦截器不可行,因为它无法拦截asp的请求)。最终找到了可以完美实现需求的方案,就是通过iis+isqpi组件的方式,只是这方面的技术资料较少,所以很是费了一番周折才最终完成,在这里给大家做个分享:
一、iis6篇
1)环境:visual studio6,是的,就是这个古老的开发工具,只有这个工具才自带了isapi的模板,因为iis6也足够古老了,它们都是“微软6系”。
2)新建工程:准备好vs6以后,新建新工程,选择"ISAPI Filter Wizard" 工程类型,一路下一步之后,工程目录就出来了(暂时将我们初始化的filter类命令为CTestFilter)。
3)打开vs初始化的工程,打开CTestFilter.cpp文件,我们可以看到有一个自动生成的函数:
BOOL CTestFilter::GetFilterVersion(PHTTP_FILTER_VERSION pVer)
{
// Call default implementation for initialization
CTestFilter::GetFilterVersion(pVer);
// Clear the flags set by base class
pVer->dwFlags &= ~SF_NOTIFY_ORDER_MASK;
// Set the flags we are interested in
pVer->dwFlags |= SF_NOTIFY_ORDER_HIGH| SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_SEND_RAW_DATA;
// Load description string
TCHAR sz[SF_MAX_FILTER_DESC_LEN+1];
ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
IDS_FILTER, sz, SF_MAX_FILTER_DESC_LEN));
_tcscpy(pVer->lpszFilterDesc, sz);
return TRUE;
}
不要关注其他代码,只需要关注红色字体部分,这几个系统常量是用来指定筛选器需要拦截哪些http内容的,我简单拦截类型有好几种,详细信息可以查询msdn的文档,我只简单介绍下其中的SF_NOTIFY_PREP