在 J2EE Web 开发中有过滤器 filter,该 filter 可以对指定的 URL 访问进行拦截,并执行过滤器的方法,根据实际应用情况,在过滤器中修改请求的代码、判断会话信息,也可以做权限控制,总之这个过滤器是非常有意义的,也可以说是责任链设计模式在 J2EE 中的一个应用。那么在 ASP.NET 中是否也可以定义这样的过滤器结构,并在过滤器中进行相应的逻辑操作呢?答案是肯定,本文将告诉你如果编写一个过滤器,又如何配置到 IIS 的 Web 应用之中。
过程一:如何编写过滤器
编写过滤器,其实就是编写一个过滤器的类,也就是编写一个 HttpModule 模块,这个过滤器应该实现 IHttpModule 基类,并重写 Init 方法,给你一个实际的例子如下:
这是一个 PageFilter.cs
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;
}
}
需要说明的是,“ 过滤器 ” 也可以称为是 “ 拦截器 ”,即拦截整个 HTTP 请求 / 响应的过程,因为整个请求 / 响应过程可以分为许多个阶段,那么这里 面就会涉及到一个问题,也就是你的过滤器想拦截具体的哪一个阶段,上面的 Init 函数中,可以自己定义想拦截的具体阶段,例如上面拦截是产生请求会话的阶 段,AcquireRequestStat 是这个状态的代表,而拦截后对应的处理函数为 Application_AcquireRequestState,所以下面定义了一个 Application_AcquireRequestState 方法,在该方法中可以通过强制类型转换获得 application、context、session、request、response 等一系列对象,在 获得这些对象的基础上,你就可以进行核心业务逻辑的编写了,例如获得判断当前 URL 访问是否合法,检查当前访问是否为登录后用户的访问等等。
另外既然有拦截的整个过程有许多阶段,那么如何拦截其它的阶段呢?这个应该很简单了,与上面类似在 Init 中按如下逻辑定义即可:
application. 阶段的标准名称 1 += new EventHandler(该阶段对应的处理方法名称 1);
application. 阶段的标准名称 2 += new EventHandler(该阶段对应的处理方法名称 2);
。。。
阶段的标准名称,是说这些阶段是有标准的名称的,而且是 application 对象的标准属性,例如上面 AcquireRequestState,还有诸如 BeginRequest、AuthenticateRequest、AuthorizeRequest、ResolveRequestCache、AcquireRequestState、PreRequestHandlerExecute、PostRequestHandlerExecute、ReleaseRequestState、UpdateRequestCache、EndRequest 许多阶段等等,这些阶段都有特定的含义.
该阶段对应的处理方法名称,其实就是你自己定义对应这个阶段处理的方法,上面已有样例,不再多解释。
还有一点需要特别注意,有那么多阶段可以拦截,但是实际应用中,我们拦截的往往也就一两个阶段,而且要注意有些服务器对象只有在特定的阶段才可以拦截到,例如 Session 对象在 BeginRequest 阶段中是没有的,在 AcquireRequestState 及其以后阶段中是有的,因此要根据实际需求来拦截具体的阶段,这个是新手最容易遇到的问题。
过程二:如何配置过滤
我们编写好了一个.cs 文件的过滤器,那么如何让这个过滤器起作用呢,这个需要进行配置,默认肯定是不会拦截的,你需要将该过滤器配置到应用的 Web.config 文件之中,上述样例的配置如下:
<configuration>
<system.web>
<httpModules>
<add name="pageModule" type="PageFilter"/>
</httpModules>
</system.web>
</configuration>
这样其实就配置好了,然后发布网站生成 dll 等就可以了,到时后会自动拦截 URL 访问的,不过要记住一点,默认情况下对于该应用的所有请求都会 被拦截,如果你指向拦截特定的请求,例如想只对 aspx 文件的请求进行拦截,那么可以在过滤器逻辑中加入对文件后缀名的判断,如果不是 aspx 的直接放过 即可