中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

IIS篩選器編程-創(chuàng)新互聯(lián)

基于Vc++開發(fā)IIS7以及IIS6的萬能篩選器

在撫遠(yuǎn)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站制作,撫遠(yuǎn)網(wǎng)站建設(shè)費(fèi)用合理。

一、iis6篇

1)新建工程:準(zhǔn)備好vs6以后,新建新工程,選擇"ISAPI Filter Wizard" 工程類型,一路下一步之后,工程目錄就出來了(暫時將我們初始化的filter類命令為CTestFilter)。

2)打開vs初始化的工程,打開CTestFilter.cpp文件,我們可以看到有一個自動生成的函數(shù):

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;
}

不要關(guān)注其他代碼,只需要關(guān)注紅色字體部分,這幾個系統(tǒng)常量是用來指定篩選器需要攔截哪些http內(nèi)容的,我簡單攔截類型有好幾種,詳細(xì)信息可以查詢msdn的文檔,我只簡單介紹下其中的SF_NOTIFY_PREPROC_HEADERS和 SF_NOTIFY_SEND_RAW_DATA,SF_NOTIFY_PREPROC_HEADERS代表在iis處理http的header請求時觸發(fā)一次攔截,而SF_NOTIFY_SEND_RAW_DATA代表在iis向客戶端回寫http的response內(nèi)容前觸發(fā)攔截,在這個攔截當(dāng)中,你可以接收到response的指針,修改response的內(nèi)容。

3)還是用wizard,去實(shí)現(xiàn)CHttpFilter基類的各個攔截方法(需要與前面的GetFilterVersion方法中指定的攔截事件對應(yīng),否則iis不會觸發(fā)這些方法的),這里我還是介紹下與上一步向?qū)?yīng)的OnSendRawData(CHttpFilterContext* pfc, PHTTP_FILTER_RAW_DATA pRawData)和OnPreprocHeaders(CHttpFilterContext* pfc,PHTTP_FILTER_PREPROC_HEADERS pHeaders)兩個函數(shù),大家可以很容易地看出這兩個函數(shù)與前面兩個攔截類型的對應(yīng)關(guān)系。OnPreprocHeaders是專門用來在iis處理http請求前,對客戶端的http header進(jìn)行處理,其中入?yún)Headers是個結(jié)構(gòu)型數(shù)據(jù),其中包含了一個指向header對象的指針,我們可以拿到這個指針進(jìn)行預(yù)處理,并可以修改headers的內(nèi)容。

OnSendRawData可以說是這些方法中最強(qiáng)悍的了,它可以拿到iis的response內(nèi)容,并可以修改response的內(nèi)容,其中pRawData這個結(jié)構(gòu)型的入?yún)⒕桶藃esponse內(nèi)容的指針,還是上代碼給大家講講這個函數(shù)是如何去修改一切的吧:

DWORD CTestFilter::OnSendRawData(CHttpFilterContext* pfc, PHTTP_FILTER_RAW_DATA pRawData)
{
// TODO: Add your specialized code here and/or call the base class
CString resp="Hello isapi??!";
void* mem=(void*)pfc->AllocMem(resp.GetLength());//必須使用isapi提供的申請內(nèi)存方法,才能正常返回http內(nèi)容,用isapi的方法申請的內(nèi)存,iis會自動幫你回收
memset(mem,0,resp.GetLength());
memcpy(mem,resp.GetBuffer(0),resp.GetLength());
pRawData->cbInBuffer=resp.GetLength();
pRawData->cbInData=resp.GetLength();
pRawData->pvInData=mem;
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}

這樣修改過后,所有客戶端的請求都變成了”Hello isqpi?。 傲?,而且連正常的http頭都被去掉了。

4)部署:編譯完成剛才的工程后,我們可以得到一個TestFilter.dll的文件,打開iis6的管理頁面,進(jìn)入web站點(diǎn)的屬性對話框,到isapi的選項(xiàng)卡中,添加我們剛才生成的dll文件,并重啟iis服務(wù)器,ok,iis就只會返回”Hello isapi?。 傲?。

IIS篩選器編程

二、iis7篇

伴隨著windows server2008的出現(xiàn),iis7也一起推出,iis7雖然也可以通過很曲折的方式,實(shí)現(xiàn)isapi接口功能,但根據(jù)實(shí)踐的情況來開,iis7在使用isapi擴(kuò)展來實(shí)現(xiàn)攔截功能時,經(jīng)常會出現(xiàn)攔截不了的煩人問題,這時我們在查閱了大量資料后發(fā)現(xiàn),iis7對isapi的支持本來就不好,因?yàn)槲④浻衷趇is7這個平臺上推出了一個更強(qiáng)大的攔截實(shí)現(xiàn),那就是iis擴(kuò)展模塊,iis7的所有功能都是通過加載不同的模塊來實(shí)現(xiàn)的,而且為我們實(shí)現(xiàn)攔截器特別提供了一個httpmodule的模塊,這個模塊是凌駕于所有http請求的,不管你使用的asp還是asp.net甚至是借用iis做服務(wù)器的php服務(wù)器,所有的請求都會先經(jīng)過這個模塊來處理,難怪微軟不會去關(guān)注iis7對isapi的兼容問題,它要推新東西了嘛~

下面我們就介紹下如何通過iis的模塊來實(shí)現(xiàn)攔截并修改http請求的功能:

1)環(huán)境準(zhǔn)備:visual studio2008/2005+iis7+windows server2008。

2)新建c++工程:在vs中新建一個空的動態(tài)鏈接庫的工程。

3)新建一個CHttpModule的子類CMyHttpModule(需要基于對頭文件httpserv.h的引用),并實(shí)現(xiàn)一個虛方法OnBeginRequest:

#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>

class CMyHttpModule: public CHttpModule
{
public:
REQUEST_NOTIFICATION_STATUS
OnBeginRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );

// 創(chuàng)建一個 HRESULT 來接收方法返回值.
HRESULT hr;

// 獲取一個指向response對象的指針.
IHttpResponse * pHttpResponse = pHttpContext->GetResponse();

if (pHttpResponse != NULL)
{
// 直接清理掉原來的response內(nèi)容.
pHttpResponse->Clear();
// 設(shè)置response的格式.
pHttpResponse->SetHeader(
HttpHeaderContentType,"text/plain",
(USHORT)strlen("text/plain"),TRUE);

PCSTR pszBuffer = "Hello HttpModule?。?!";
// 創(chuàng)建一個數(shù)據(jù)塊.
HTTP_DATA_CHUNK dataChunk;
// 把數(shù)據(jù)塊類型設(shè)置成http類型的(后續(xù)的內(nèi)存清理工作就會由iis容器自己完成).
dataChunk.DataChunkType = HttpDataChunkFromMemory;
DWORD cbSent;

// 給數(shù)據(jù)塊賦值.
dataChunk.FromMemory.pBuffer =
(PVOID) pszBuffer;
dataChunk.FromMemory.BufferLength =
(USHORT) strlen(pszBuffer);
// 將數(shù)據(jù)塊插入到response內(nèi)容中.
hr = pHttpResponse->WriteEntityChunks(
&dataChunk,1,FALSE,TRUE,&cbSent);

if (FAILED(hr))
{
pHttpResponse->SetStatus(500,"Server Error",0,hr);
}

return RQ_NOTIFICATION_FINISH_REQUEST;
}
return RQ_NOTIFICATION_CONTINUE;
}
}

4)新建一個實(shí)現(xiàn)了IHttpModuleFactory接口的工廠類,用來注冊攔截模塊和攔截的方式

class CMyHttpModuleFactory : public IHttpModuleFactory
{
public:
HRESULT
GetHttpModule(
OUT CHttpModule ** ppModule,
IN IModuleAllocator * pAllocator
)
{
UNREFERENCED_PARAMETER( pAllocator );

// 實(shí)例化一個模塊的指針.
CMyHttpModule * pModule = new CMyHttpModule;

if (!pModule)
{
return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
}
else
{
*ppModule = pModule;
pModule = NULL;
return S_OK;
}
}

void
Terminate()
{
// 清理自己的內(nèi)存.
delete this;
}
};

// 用來注冊模塊工廠的方法.
HRESULT
__stdcall
RegisterModule(
DWORD dwServerVersion,
IHttpModuleRegistrationInfo * pModuleInfo,
IHttpServer * pGlobalInfo
)
{
UNREFERENCED_PARAMETER( dwServerVersion );
UNREFERENCED_PARAMETER( pGlobalInfo );

// 設(shè)置需要攔截的方式,這里設(shè)置的是給客戶端返回response內(nèi)容前,和我們之前iis6的示例類似,可以設(shè)置多個,但必須和你的httpmodule中對應(yīng).
return pModuleInfo->SetRequestNotifications(
new CMyHttpModuleFactory,
RQ_BEGIN_REQUEST,
0
);
}

5)編譯并生成一個MyHttpModule.dll的動態(tài)鏈接庫,將保存MyHttpModule.dll的全路徑添加到%windir%\system32\inetsrv\config\applicationHost.config文件的globalModules節(jié)點(diǎn)下,重啟iis,ok,這下訪問你iis中的任何一個文件,返回的內(nèi)容都會是:“Hello HttpModule?。?!”。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前標(biāo)題:IIS篩選器編程-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://www.rwnh.cn/article34/jdpse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站策劃、建站公司品牌網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
宝鸡市| 铜山县| 乡宁县| 门头沟区| 渭源县| 河南省| 吴江市| 克东县| 克东县| 重庆市| 太白县| 杭锦后旗| 丹东市| 林西县| 方城县| 华亭县| 江孜县| 郸城县| 木兰县| 汤阴县| 拜城县| 都昌县| 安康市| 乐都县| 齐齐哈尔市| 霍林郭勒市| 石城县| 汝州市| 民丰县| 淮滨县| 福州市| 琼中| 祁阳县| 乌鲁木齐市| 扎兰屯市| 宜兰县| 军事| 永嘉县| 太湖县| 锡林郭勒盟| 梓潼县|