前几天客户(政府部门)打电话过来说系统被百度收录,并且可以不登录就能访问其中的某些页面。

急急忙忙赶过去解决问题。(中间还有小插曲:打的过去的,由于跨了几个区,结果的哥也不认识路,哎呦折腾的天都黑了,路费狂飙……)

这个系统是公司最老的系统之一,是好几年前的,开发那个乱啊,维护着就心烦。

一到那边就被客户训了,说这个怎么回事,问题很大,XX领导都发话了……(一大堆*****)

还好咱习惯了,解决问题才是目的。

页面被百度抓取了,其实就是百度能访问这个页面,也就是未验证的用户也可访问。

问题已经很明显出在哪里啦,可问题是不知道多少页面没有验证。

当然也就想到了写一个HttpHandler,来注册页面事件验证用户。

Ok,马上就动手写。

 

public class ValidateHttpHandlerFactory : IHttpHandlerFactory, IReadOnlySessionState
{
    #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)
    {

    }

    #endregion

    void page_Init(object sender, EventArgs e)
    {
         //这里来验证访问用户的合法性
        //Session
       //需要排除登录页面
    }

}

由于系统中是使用Session保存用户信息,所以在这里要访问Session需要继承IReadOnlySessionState接口。

如果还要写Session就需要继承IRequiresSessionState接口。

然后在web.config里面配置。

<httpHandlers>
    <add path="*.aspx" verb="*" type="Hxj.Web.HttpHandlerFactory.ValidateHttpHandlerFactory,Hxj.Web.HttpHandlerFactory"/>
</httpHandlers>

这样就可以接管aspx页面,并且注册了Init 事件,来验证用户。

 

问题自然也就解决啦。

posted on 2010-05-22 22:11  steven hu  阅读(5541)  评论(17编辑  收藏