大学大学,大概学学 之 利用Http PipeLine

看到一些同学的课程设计中, Admin登陆后页面跳转到Main.aspx, 即使不知道Admin的密码时, 直接在浏览器中输入localhost:xxx/XXX/XXX/Main.aspx也可进入Admin页面, 这个bug是个问题。

第一个想到的解决方法就是为Main.aspx在加载时添加如下逻辑:
判断用户名是否已在session中, 如在, 则继续, 如不在, 则跳至Login.aspx。

问题是如果有很多类似Main.aspx页面或者更进一步, 需要为每个页面添加一些信息时呢?上面的方法是可以解决问题, 但是如果能够用更本质的方法解决这一类问题总是更好的选择, Http PipeLine就是这样的选择。

ASP.NET 请求处理过程基于管道模型, 这个管道模型是由多个HttpModule和HttpHandler组成, ASP.NET 把http请求依次传递给管道中各个HttpModule, 然后被HttpHandler处理, 处理完成后再经过管道中的HTTP模块, 返回结果。我们可以在相应HttpModule中完成session的判断或者信息的添加等操作。

//IHttpModule接口的声明:
public interface IHttpModule
{
    void Init (HttpApplication context);
    void Dispose ();
}

我们在Init中注册事件, 这里涉及session的操作, 故可注册AcquireRequestState和PreRequestHandlerExecute事件。

public class MyModule: IHttpModule
{
    public void Dispose()
    {
 
    }
 
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += new EventHandler(context_AcquireRequestState);
    }
 
    void context_AcquireRequestState(object sender, EventArgs e)
    {
         // 从URL中获取请求页面的名字
 
        if (如果请求页面不是Login.aspx)
        {
            if (如果session中该用户权限不够)
            {
                //记住用户请求,用于登陆后直接跳转
                   //终止当前页,执行Login.aspx
            }
        }
    }
}

当然, 在Login时要记得添加用户及其权限信息到session。

最后, 在web.config中注册MyModule,将其添加进<httpModules/>节点。

现在, 用户的每个页面请求都会执行以上判断, 导致用户请求访问权限以外的页面时, 系统自动跳转到Login.aspx要求其登录。

posted @ 2011-06-01 21:14  Chen.  Views(882)  Comments(0Edit  收藏  举报