作者:Tony Qu
说到ISAPI很多人会觉得很陌生,因为如果你是做ASP.NET开发的话,ISAPI的方式已经过时,取而代之的是HttpHandler和HttpModule,说到这两个东西很多人估计明白了,ISAPI可以说是早期实现请求拦截和处理的唯一途径,只是随着ASP.NET的流行,渐渐淡出了开发人员的视野。
此文的开发场景是这样的,我们公司使用古老的ASP语言,但是ASP的Response.Cookies属性中没有HttpOnly(但.Net的Cookie对象是有HttpOnly属性的),有帖子说可以利用Path属性来设置HttpOnly,可以这么做是因为我们在页面中设置cookie值的动作都会被转换成Set-Cookie头,如下
Set-Cookie: user=t=bfabf0b1c1133a822; path=/
但如果要让cookie变成HttpOnly,就需要用如下格式:
Set-Cookie: user=t=bfabf0b1c1133a822; path=/;HttpOnly
理论上讲设置Path是完全可行的,因为说白了就是在原来Path的基础上增加;HttpOnly,
但经试验表明这行不通,比如我用下面的代码
Response.Cookies(“user”).Path+=”;HttpOnly”;
得到的结果却是
Set-Cookie: user=t=bfabf0b1c1133a822; path=/3B%;HttpOnly
这显然是不行的,所以我们不得不考虑用ISAPI来实现。
ISAPI基础
首先,请不要把ISAPI Extension和ISAPI Filter混为一谈,这两个东西虽然只差一个字,但却完全是两样东西,所提供的接口是完全不一样的。ISAPI Extension是一个类似页面的dll,你可以对它做post或get提交,如http://localhost/abc.dll?a=1,从严格意义上讲它没有拦截的功能,和cgi差不多。而ISAPI Filter则是具有过滤功能的,你可以在IIS网站的属性中添加需要加载的ISAPI Filter,例如asp.net的实现也使用了一个ISAPI Filter,叫做aspnet_filter.dll。
ISAPI Filter说到底就是一个DLL,它有两个主要的接口:GetFilterVersion和HttpFilterProc,如下所示:
BOOL WINAPI __stdcall GetFilterVersion(HTTP_FILTER_VERSION *pVer)
{
/* Specify the types and order of notification */
pVer->dwFlags = (SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_AUTHENTICATION |
SF_NOTIFY_URL_MAP | SF_NOTIFY_SEND_RAW_DATA | SF_NOTIFY_LOG | SF_NOTIFY_END_OF_NET_SESSION );
pVer->dwFilterVersion = HTTP_FILTER_REVISION;
strcpy(pVer->lpszFilterDesc, "Upper case conversion filter, Version 1.0");
[1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页
[Cpp]Windows编程--伪句柄 (佚名,01-06)> Windows编程--伪句柄 Posted on 2011-01-05 21:22 0hui0 阅读(59) 评论(0) 编辑 收藏 所属分类: Windows编程 <!-- 在系统中,对象分两类:核心对象和用户对象。如进程对象,线程对象……
[Cpp]vs下调试多个c项目联调 (佚名,08-10)> 一.Debug版本和Release版本的区别Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。只有Debug版本的程序才能设置断点、单步……
[Cpp]HEVC bit depth increasment (佚名,10-29)Body> /// encoder configuration class class TAppEncCfg { // coding tools (bit-depth) UInt m_uiInputBitDepth; ///< bit-depth of input fil……
[Cpp]正确使用STL-MAP中Erase函数 (佚名,08-10)> 正确使用STL-MAP中Erase函数 一切尽在代码中#include <iostream>#include <map>#include <string>using namespace std ;int main(void) { ……
[Cpp]100题_16 O(logn)求Fibonacci数列 (佚名,03-09)Body> 我们很容易想到递归和循环的方法,最快是O(n)的 对于O(lgn)的解法,我们要用到公式: f(n) f(n-1) 1 1 (n-1)f(……