在J2EE Web開發(fā)中有過濾器filter,該filter可以對指定的URL訪問進行攔截,并執(zhí)行過濾器的方法,根據(jù)實際應(yīng)用情況,在過濾器中修改請求的代碼、判斷會話信息,也可以做權(quán)限控制,總之這個過濾器是非常有意義的,也可以說是責(zé)任鏈設(shè)計模式在J2EE中的一個應(yīng)用。
那么在ASP.NET中是否也可以定義這樣的過濾器結(jié)構(gòu),并在過濾器中進行相應(yīng)的邏輯操作呢?答案是肯定,本文將告訴你如果編寫一個過濾器,又如何配置到IIS的Web應(yīng)用之中。
編寫過濾器,其實就是編寫一個過濾器的類,也就是編寫一個HttpModule模塊,這個過濾器應(yīng)該實現(xiàn)IHttpModule基類,并重寫Init方法,給你一個實際的例子如下:
using System;
using System.Web;
using System.Web.SessionState;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.IO;
public class PageFilter: IHttpModule
{
public String ModuleName
{
get { return "PageFilter"; }
}
//在 Init 方法中注冊HttpApplication
// 通過委托方式注冊事件
public void Init(HttpApplication application)
{
application.AcquireRequestState += new EventHandler(Application_AcquireRequestState);
}
private void Application_AcquireRequestState(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
HttpSessionState session = context.Session;
HttpRequest request = context.Request;
HttpResponse response = context.Response;
String contextPath = request.ApplicationPath;
}
}
階段的標(biāo)準(zhǔn)名稱,是說這些階段是有標(biāo)準(zhǔn)的名稱的,而且是application對象的標(biāo)準(zhǔn)屬性,例如上面AcquireRequestState,還有諸如BeginRequest、AuthenticateRequest、AuthorizeRequest、ResolveRequestCache、AcquireRequestState、PreRequestHandlerExecute、PostRequestHandlerExecute、ReleaseRequestState、UpdateRequestCache、EndRequest許多階段等等,這些階段都有特定的含義.
還有一點需要特別注意,有那么多階段可以攔截,但是實際應(yīng)用中,我們攔截的往往也就一兩個階段,而且要注意有些服務(wù)器對象只有在特定的階段才可以攔截到,例如Session對象在BeginRequest階段中是沒有的,在AcquireRequestState及其以后階段中是有的,因此要根據(jù)實際需求來攔截具體的階段,這個是新手最容易遇到的問題。
我們編寫好了一個.cs文件的過濾器,那么如何讓這個過濾器起作用呢,這個需要進行配置,默認肯定是不會攔截的,你需要將該過濾器配置到應(yīng)用的Web.config文件之中,上述樣例的配置如下:
這樣其實就配置好了,然后發(fā)布網(wǎng)站生成dll等就可以了,到時后會自動攔截URL訪問的,不過要記住一點,默認情況下對于該應(yīng)用的所有請求都會被攔截,如果你指向攔截特定的請求,例如想只對aspx文件的請求進行攔截,那么可以在過濾器邏輯中加入對文件后綴名的判斷,如果不是aspx的直接放過即可