代码改变世界

系统登录统一验证

2010-05-23 21:46  Kevin-wang  阅读(504)  评论(0编辑  收藏  举报

前几天发现系统中某些页面被搜索收录,并且可以不登录就能访问其中的某些页面。当然也就想到了写一个HttpHandler,来注册页面事件验证用户。

马上开工………

1.创建一个类实现IHttpHandlerFactory接口;如果登录信息是保存在Session中的话还需要实现IReadOnlySessionState接口
    public class ValidateHttpHandlerFactory : IHttpHandlerFactory, IReadOnlySessionState
    {
    }

2.实现IHttpHandlerFactory接口的方法;
   IHttpHandlerFactory接口包含两个方法需要实现GetHandler()和ReleaseHandler();

 #region IHttpHandlerFactory 成员
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
  PageHandlerFactory _Factory = (PageHandlerFactory)Activator.CreateInstance(typeof(PageHandlerFactory), true);
  IHttpHandler _Handler = _Factory.GetHandler(context, requestType, url, pathTranslated);
  Page _Page = _Handler as Page;
  if (_Page != null)
  {  
    _Page.Init += new EventHandler(Page_Init);
  }
  return _Handler;
}
public void ReleaseHandler(IHttpHandler handler)
{
}
/// <summary>
/// 页面初始化事件委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Page_Init(object sender, EventArgs e)
{
  //需要排除登录页面
  //..........
  //需要验证登录的页面
  Page _Container = sender as Page;
  if (_Container != null)
  {
    //此例是将用户登录信息保存在Cookie中
    if (_Container.Request.Cookies["userinfo"] == null)
    {
      _Container.Response.Redirect("Error.html");
    }
  }
}
#endregion
3.增加web.config配置信息
    <httpHandlers>
        
<add path="*.aspx" verb="*" type="WebApplication2.ValidateHttpHandlerFactory,WebApplication2"/>
    
</httpHandlers>

一切OK,这样就可以接管aspx页面,并且注册了Init 事件,来验证用户。Error.html是一个错误提示页面,由于代码比较简单这里就不提供代码的下载了。
通过验证的效果图:
image

未能通过验证的页面效果图:
image
OK,完成。