• 判断asp.net中session过期的方法


    判断asp.net中session过期的方法

    转载自:http://www.cnblogs.com/xilipu31/archive/2013/04/12/3016830.html

    方法一:最麻烦也是最容易想到的方法,在每个页面的page_load()方法里面判断:

    复制代码
    protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    if (Session["username"] != null)
                    {
    
                        //登陆成功的情况
                        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script>alert('登录成功!')</script>");
                    }
                    else
                    {
                        //过期,重新登录
                        Response.Redirect("LoginForm.aspx");
    
                    }
                }
            }
    复制代码

        缺点:代码冗余,重复写判断session代码。

    方法二:重写HttpModule中的Init()方法,然后判断session过期情况。

      1.新建一个继承IHttpModule接口的类Module ,让Module类实现IHttpModule接口成员。

      2.在Init()方法中对Context进行注册AcquireRequestState事件。

      3.在AcquireRequestState方法中实现判断session代码。

    复制代码
    using System;
    using System.Data;
    using System.Configuration;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    
    namespace JudgeSessionOutTime
    {
        //1.继承IHttpModule类,实现接口成员
        public class Module:IHttpModule
        {
            #region IHttpModule 成员
    
            public void Dispose()
            {
                throw new NotImplementedException();
            }
    
            //2.在Init()方法中对Context进行注册AcquireRequestState事件。
            public void Init(HttpApplication context)
            {
                context.AcquireRequestState+=new EventHandler(context_AcquireRequestState);
            }
    
            //3.完善AcquireRequestState方法,然后判断session过期
            public void context_AcquireRequestState(object sender, EventArgs e)
            {
                HttpApplication app = (HttpApplication)sender;
    
                if (app.Context.Session["username"] == null)
                {
                    app.Response.Write("<script>alert('session到期!');</script>");
                }
            }
    
            #endregion
        }
    }
    复制代码

      4.配置web.config文件,在<system.web>中添加以下代码

    复制代码
    <httpModules>
          
            <!--重写IHttpModule类,需要配置的信息-->
            <add name="demo" type="JudgeSessionOutTime.Module"/>
            <!--type后面是命名空间.类名-->
          
    </httpModules>
    复制代码

      优点:效率高,代码无冗余,一次配置,全程受用。

      原理:实现IHttpModule接口的类Module是在执行页面之前就会执行。即:在page_load()事件执行之前,就会执行 Module,然后执行判断session方法,未过期,继续执行,过期,就会执行相应操作,就不用执行page_load()页面的方法了。

      感悟:说实话,对于这点,在做网站登录,然后判断用户名方面,我觉得不太适合,因为,一旦程序开始加载,就会执行module类方法,那时候session还是空,所以无论怎样,都不会放下走,一直停在登录界面(个人见解,欢迎各位拍砖!)

    方式三:重写继承page的OnInit()虚方法,在需要的界面上,继承这个类。

      1.新建继承page类的类JudgeSession,实现接口成员。

      2.重写OnInit()方法,判断session情况。

      3.在需要判断session过期情况的页面上,继承该JudgeSession类,而不是page类,从而实现效果。

    复制代码
    //JudgeSession 类
    
    using System;
    using System.Data;
    using System.Configuration;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    
    namespace JudgeSessionOutTime
    {
        public class JudgeSession : System.Web.UI.Page
        {
            protected override void OnInit(EventArgs e)
            {
                if (Session["username"] == null)
                {
                    Response.Write("session过期!");
                }
                else
                {
                    Response.Write("session没有过期,用户名:"+Session["username"].ToString());
                }
            }
    
        }
    }
    复制代码

      优点:方法灵活,代码重用率高。在需要判断session的页面继承JudgeSession类,不需要的页面,继承page类即可。

  • 相关阅读:
    PHP-redis中文文档
    非关系型数据库Redis学习(3)
    非关系型数据库Redis学习(1)
    【Android】找不到类
    【leetcode】删除单向链表的节点
    【上海交大oj】数学题3(数位dp)
    【上海交大oj】括号匹配加强 (动态规划)
    【上海交大oj】纸来纸去(动态规划)
    【上海交大oj】1053 二哥的内存
    【上海交大oj】畅畅的牙签袋(改)(枚举+模拟)
  • 原文地址:https://www.cnblogs.com/yzenet/p/3596125.html
Copyright © 2020-2023  润新知