大学大学,大概学学 之 利用Http PipeLine
时间:2011-06-01 来源:Chen.
看到一些同学的课程设计中, 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要求其登录。