httpModule接口

本文介绍ASP.NET中HttpModule的实现方法及其在权限控制中的应用,通过注册HttpApplication事件并处理权限验证,实现模块化权限管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1.编写一个类,实现IhttpModule接口
2.实现Init 方法,并且注册需要的方法
3.实现注册的方法
4.实现Dispose方法,如果需要手工为类做一些清除工作,可以添加Dispose方法的实现,但这不是必需的,通常可以不为Dispose方法添加任何代码。
5.在Web.config文件中,注册您编写的类
下面是一个HttpModules的示例,在这个示例中,只是简单的注册了HttpApplication 的BeginRequest 和 EndRequest事件,并且通过这些事件的实现方法,将相关的信息打印出来。
例1:
using System;
using System.Web;
namespace MyModule
{
 public class MyModule : IHttpModule
 {
  public void Init(HttpApplication application)
  {
   application.BeginRequest += (new
EventHandler(this.Application_BeginRequest));
   application.EndRequest += (new
EventHandler(this.Application_EndRequest));
  }
      private void Application_BeginRequest(Object source, EventArgs e)
  {
   HttpApplication Application = (HttpApplication)source;
            HttpResponse Response=Application.Context.Response;
   Response.Write("<h1>Beginning of Request</h1><hr>");
  }
      private void Application_EndRequest(Object source, EventArgs e)
  {
   HttpApplication application = (HttpApplication)source;
   HttpResponse Response=Application.Context.Response;
   Response.Write("<h1>End of Request</h1><hr>");
  }
  public void Dispose()
  {
  }
 }
}

程序的开始引用了如下名称空间:

using System;
using System.Web;

因为HttpApplication、HttpContext、HttpResponse等类在System.Web中定义,因此,System.Web名称空间是必须引用的。

MyModule类实现了IhttpModule接口。在Init方法中,指明了实现BeginRequest 和EndRequest 事件的方法。在这两个方法中,只是简单的分别打印了一些信息。

下面,在Web.config文件中注册这个类,就可以使用这个HttpModule了,注册的方法如下:

<configuration>
    <system.web>
        <httpModules>
            <add name=" MyModule " type=" MyModule, MyModule" />
        </httpModules>
    </system.web>
</configuration>

现在来看一下效果。编写一个Aspx页面test.aspx,内容如下:

<%
Response.Write("<h1>This is the Page</h1><hr>");
%>

运行以后的界面如图所示:

深入研究HttpModule

HttpModule通过对HttpApplication对象的一系列事件的处理来对HTTP处理管道施加影响,这些事件在HttpModule的Init方法中进行注册,包括:

BeginRequest
AuthenticateRequest
AuthorizeRequest
ResolveRequestCache
AcquireRequestState
PreRequestHandlerExecute
PostRequestHandlerExecute
ReleaseRequestState
UpdateRequestCache
EndRequest

其中部分事件同Global.asax中的事件相对应,对应关系如下:

HttpModule

Global.asax

BeginRequest

Application_BeginRequest

AuthenticateRequest

Application_AuthenticateRequest

EndRequest

Application_EndRequest

在例1中,处理了BeginRequest和EndRequest事件,其他事件的处理方式基本上类似。

同HttpHandler对应来看,这些事件,有些在HttpHandler之前发生,有些在HttpHandler处理完后发生。了解事件发生的顺序非常重要,因为,服务器端的对象在不同的时间段有着不同的表现。例子之一是Session的使用。不是所有的事件中都能对Session进行处理,而只能在有限的几个事件中进行处理。详细的过程可以参考下面的HTTP Request处理生命周期图。

使用HttpModule实现权限系统

我们在开发应用系统的时候,应用系统的权限控制是非常重要的一个部分。在ASP中,要实现权限的控制是比较麻烦的事情,因为我们必须在每个需要控制权限的ASP页面中添加权限控制代码,从而控制客户对页面的访问。这样带来的问题,除了编写大量重复代码外,由于权限控制部分同业务处理部分的模块紧密耦合在一起,对权限控制模块的修改,往往又会带来大量的修改工作,甚至造成大量的Bug。

所以,我们现在需要将权限控制和业务处理模块进行解耦,使得两个部分可以独立开发和修改,而不会互相影响,或者,将影响减到最低。在Jsp程序中,这个目的可以通过引入一个前端控制器来实现权限过滤(关于前端控制器模式,可以参见《J2EE核心模式一书》)。在ASP.Net中,我们可以利用HttpModule实现同样的效果。下面来看一下实现的过程。

首先,我们会构建一个权限处理系统,可以检测某个用户对某个模块功能是否有访问权限(具体的结构,我想,读者都应该接触过这个部分的编程,所以不再赘述),其中,暴露给客户端调用的权限校验类的定义如下:

public class RightChecker
{
 public static bool HasRight(User user,Module module)
 {
  //进行权限校验,
}
}

然后,我们利用HttpModule编写一个过滤器:

using System;
using System.Web;
namespace MyModule
{
 public class MyModule : IHttpModule
 {
  public void Init(HttpApplication application)
  {
 application. AcquireRequestState += (new
EventHandler(this.Application_AcquireRequestState));
  }
  private void Application_AcquireRequestState (Object source,
EventArgs e)
  {
   HttpApplication Application = (HttpApplication)source;
   User user=Application.Context.Sesseion["User"]  //获取User
   string url=Application.Context.Request.Path;
//获取客户访问的页面
   Module module= //根据url得到所在的模块
   If(!RightChecker.HasRight(user,module))
Application.Context.Server.Transfer("ErrorPage.aspx");
//如果没有权限,引导到错误处理的页面
  }
  public void Dispose()
  {
  }
 }
}

将这个类按照前面介绍的方法,在Web.Config中注册后,我们的应用系统就具备权限管理的功能了。怎么样,比原来的方式好很多吧?

 

在微软的网站上找到了篇关于HttpModule的文章发现这个技术非常的好,他能为我们的安全带来好处.

那么HttpModule到底是干什么的呢?

HttpModule是向实现类提供模块初始化和处置事件。

首先你要实现IHttpModule接口这个接口只有两个方法,一个是Init方法一个Dispose方法.一看方法的名字就知道了这两个方法一个是在加载前调用的,一个是Dispose时调用的(页面最后处理的一个事件).

下面代码说明了如何在所有的页面加载之前和结束写入一段文字:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

/// <summary>

/// HelloWorldModule 的摘要说明

/// </summary>

public class HelloWorldModule : IHttpModule

{

public HelloWorldModule()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

string str = "";

public String ModuleName

    {

get { return "HelloWorldModule"; }

    } 
public void Init(HttpApplication application)

    {

//注册页面请求开始和结束事件

        application.BeginRequest +=

            (new EventHandler(this.Application_BeginRequest));

        application.EndRequest +=

            (new EventHandler(this.Application_EndRequest));

    }

private void Application_BeginRequest(Object source, EventArgs e)

    {

//在页面开始请求前写入一段文字

        HttpApplication application = (HttpApplication)source;

        HttpContext context = application.Context;

        context.Response.Write(@"<h1><font color=red>

            HelloWorldModule: Beginning of Request

            </font></h1><hr>"+

        application.Request.QueryString.Count.ToString());

    }

private void Application_EndRequest(Object source, EventArgs e)

    {

//页面请求结束后写入一段文字

       HttpApplication application = (HttpApplication)source;

       HttpContext context = application.Context;

       context.Response.Write(@"<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");

    }

public void Dispose()

    {

    }

}

在web.config增加下面配置:

<httpModules>

<add name="HelloWorldModule" type="HelloWorldModule"/>

</httpModules>

上面是个小例子.那我们可以在这里做多少件事情呢?看下面的表就可以得出结论.

事件

说明

BeginRequest

指示请求处理开始。

AuthenticateRequest

PostAuthenticateRequest

封装请求身份验证过程。

AuthorizeRequest

PostAuthorizeRequest

封装请求授权过程。

ResolveRequestCache

PostResolveRequestCache

封装检查是否能利用以前缓存的输出页面处理请求的过程。

PostMapRequestHandler

指示已发现用于处理请求的 HTTP 处理程序。

AcquireRequestState

PostAcquireRequestState

封装对请求会话状态的检索。

PostRequestHandlerExecute

指示用于处理请求的 HTTP 处理程序已执行。

ReleaseRequestState

PostReleaseRequestState

封装对请求会话状态的发布。

UpdateRequestCache

PostUpdateRequestCache

封装检查是否应对请求的资源的输出进行缓存以备今后重复使用的过程。

EndRequest

指示请求处理结束。

我们可以根据相应的事件来进行处理.做了这么长时间才发现你没想到的微软都替你想到了.

在httpModule中到底要做什么?我根据一个朋友的文章写了个根据配置文件来验证页面的连接字符串的传参个数和传参的内容是否符合标准的例子.

还有个朋友给我说了,这个可以用来修改跳转Url的改写.

在CommunityServer中还用httpModule做了当异常处理的时候进行程序异常的页面打印的操作.

AuthenticateRequest 请求身份验证和AuthorizeRequest请求授权过程的操作.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值