做asp.net应用程序的都应该碰到一个问题,Session丢失,需要自动跳转到登录页面。
比如你的项目了有N个页面,难道每个页面的Onload事件里都去写上 if(session["user"]==null){...your is code...}吗?
如果不写,只在主界面,如Default.aspx页面上写,那么我直接访问你项目里的  www.xxx.com/xxx/xxx/xxx.aspx;这个时候你的程序会自动跳转到登录界面吗 ????
答案肯定不是。于是百度了一把,发觉也没什么答案,有个basepage.cs类。意思就是写一个类来判断session状态,然后每个页面都去继承这个类。
这,据说是最简洁的办法了????但是问题还是存在,我不想在我每个新建的aspx页面都去写一次继承,虽然只写简单的:basepage,但是我用的基本是AJAX技术,后台代码我根本不关心的,此时怎么办呢 ?大家先讨论下,5楼放出我自己的做法。

解决方案 »

  1.   

    Form验证具体的请查看下面的链接
    http://www.cnblogs.com/csjackie/archive/2008/11/03/1325760.html?login=1
      

  2.   


    membership 是神马能详细说下怎么处理的吗 ?其实目标很简单,就是检测Session丢了 ,然后跳到登录界面,就算完
      

  3.   

    无语,这么懒做什么编程啊,Form验证只需要写一个配置文件在后台目录里就行了,4 5行代码的事、
      

  4.   

    自己顶了2楼,那我就说我的做法吧。昨天我忽然想起来我项目中的Session丢失,跳转到登录界面这个功能还没做
    开始也是写了个basepage的类,结果刚写好,问题就来了。我的项目下面有100多个页面,,,,尼玛哦我要怎么写继承?每个页面去写一次,写到最后肯定是哪个页面继承了,哪个页面没有继承,我自己都不知道了。于是我想到了用Global.asax。这个全局配置文件,平常也没怎么关心他,这时候看它却是如此可爱了。
    新建一个Global.asax文件,默认的事件里,看了一遍,没有一个适合做这个判断Session状态的,有些事件是在session_start之前的,那时候session还不可以用,根本无法作判断。于是找了一下,找到一个事件。
    Application_PreRequestHandlerExecute
    这个事件的解释是。在 ASP.NET 页面框架开始执行诸如页面或 Web 服务之类的事件处理程序之前,该事件被触发。就是每次我们以一个a标签的形式请求服务器,它都会被触发。于是 我就动手写了。
    if(session["userid"]==null)
    {
        Response.Write("<script>window.top.location.href='http://" + HttpContext.Current.Request.Url.Host + "/User/Login.aspx'</script>");
    }
      

  5.   

    form验证确实符合你,呵呵不论自己写验证还是框架提供的
    都要面临授权的问题
    你不关心后台代码,或者说你不关心验证,那么授权那后台代码才是关键,除非你不负责推荐看下asp.net的几种验证机制,aop的权限校验
    http://www.cnblogs.com/cuishao1985/archive/2009/09/25/1574148.html
      

  6.   

    但是这个时候,也有个问题来了 。因为Global是全局控制文件,当页面跳转到login.aspx页面时候,还是会再次来触发这个 Application_PreRequestHandlerExecute事件。也就是会无限跳转下去。。我开始就是在想,,有没有办法让单独的aspx页面不受Global的控制呢 ????找了大半天,没找到。尼玛,,,,看来微软考虑的东西还是不成熟,这个时候我就是想让Login.aspx不受Global文件的控制,也就是不触发它里面的事件,但是好像微软并没提供这样的方法。于是:我只能另辟蹊径,编程嘛。大不了我多一个判断,于是我的代码变化了。
                string thisurl = HttpContext.Current.Request.FilePath.Substring(HttpContext.Current.Request.FilePath.LastIndexOf("/") + 1);
    //得到当前的页面名称。然后来判断如果页面不是登录页面,并且session为空,才执行跳转。
                if (thisurl != "Login.aspx" && Session["userid"] == null)
                {
                    Response.Write("<script>window.top.location.href='http://" + HttpContext.Current.Request.Url.Host + "/User/Login.aspx'</script>");
                }这时,问题就解决了。无需写basepage类,无需每个页面都去继承。我想这个办法应该是最简单了的吧。
      

  7.   

    哦,还可以自己写个httphandler
      

  8.   

    只需要3句代码。写在Global里,完美实现session丢失自动跳转到登录界面,不管你是访问
    www.xxx.com
    或者直接去访问 www.xxx.com/xxx/xxx/xxx.aspx ,都能跳转了。
      

  9.   

    PreRequestHandlerExecute 会把除了aspx的其他请求也捕获吧,你注意下,比如图片
      

  10.   

    我的做法:写一个公共类A,A继承Page基类。然后A中验证Session,其他页面继承A即可。每个页面中就不用重复写验证Session的代码了。
      

  11.   

    这个事件的解释就是  在 ASP.NET 页面框架开始执行诸如页面或 Web 服务之类的事件处理程序之前,该事件被触发。要想下,我们的Session如果丢失了,就应该禁止做任何操作,所以这样判断不应该出任何问题。