利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆(修改)

    技术2025-10-23  18

    转自

     

     

    using System;using System.Collections.Generic;using System.Data;using System.Configuration;using System.Web;using System.Web.UI;using System.Collections;

    namespace BNet.Web.Modulers{    /** <summary>    /// SingleLoginModuler 的摘要说明    /// </summary>    public class SingleLoginModuler : System.Web.IHttpModule    {        const string sigle_login_userid = "evlon_siglelogin_userid";        const string sigle_pre_logout_sessionid = "evlon_sigle_pre_logout_sessionid";

            public static StringLifeValueDictionary UsableGetter(ref StringLifeValueDictionary dic)        {            if (dic == null)            {                dic = new StringLifeValueDictionary();            }            else            {                List<string> listRemove = new List<string>();                //StringLifeValueDictionary.Enumerator iter = dic.GetEnumerator();                IDictionaryEnumerator iter = dic.GetEnumerator();                while (iter.MoveNext())                {                    if (((LifeValue)iter.Entry.Value).life < DateTime.Now)                    {                       // listRemove.Add(iter.Current.Key);                        listRemove.Add((string)iter.Entry.Key);

                        }                }

                    foreach (string key in listRemove)                {                    dic.Remove(key);                }            }

                return dic;        }

            static StringLifeValueDictionary loginedUserIdDictionary = null;        static StringLifeValueDictionary LoginedUserIdDictionary        {            get            {                return UsableGetter(ref loginedUserIdDictionary);            }        }

            static StringLifeValueDictionary preLogoutSessionIdDictionary = null;        static StringLifeValueDictionary PreLogoutSessionIdDictionary        {            get            {                return UsableGetter(ref preLogoutSessionIdDictionary);            }        }

            public SingleLoginModuler()        {            //            // TODO: 在此处添加构造函数逻辑            //        }

            //IHttpModule 成员        #region IHttpModule 成员

            public void Dispose()        {        }

            public void Init(HttpApplication context)        {            context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);            context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute);

            }

     

            void context_PreRequestHandlerExecute(object sender, EventArgs e)        {            HttpApplication context = sender as HttpApplication;            IHttpHandler httpHandler = context.Context.CurrentHandler;            ISingleLogin sl = httpHandler as ISingleLogin;            if (sl != null)            {                string suid = sl.SigleUserLoginId;                if (suid != string.Empty)                {                    if (PreLogoutSessionIdDictionary.ContainsKey(context.Session.SessionID))                    {                        //这个用户应该强制登出                        PreLogoutSessionIdDictionary.Remove(context.Session.SessionID);

                            Page page = (Page)httpHandler;                        page.PreInit += new EventHandler(page_PreInit);

                        }                    else if (!LoginedUserIdDictionary.ContainsKey(suid))                    {                        LoginedUserIdDictionary.Add(suid, new LifeValue(context.Session.SessionID));                    }                }            }

            }

            void page_PreInit(object sender, EventArgs e)        {            Page page = sender as Page;            ISingleLogin sl = page as ISingleLogin;            if (sl != null)            {                sl.SigleUserLogout();                page.Response.End();            }        }

            void context_PostRequestHandlerExecute(object sender, EventArgs e)        {            //从LogineduserId 里找到和当前用户一样的用户ID的SessionId            HttpApplication context = sender as HttpApplication;            IHttpHandler httpHandler = context.Context.CurrentHandler;            ISingleLogin sl = httpHandler as ISingleLogin;            if (sl != null)            {                string suid = sl.SigleUserLoginId;                if (suid != string.Empty)                {                    if (LoginedUserIdDictionary.ContainsKey(suid))                    {                        string sessionId = LoginedUserIdDictionary[suid].value;                        if (sessionId != context.Session.SessionID)                        {                            if (!PreLogoutSessionIdDictionary.ContainsKey(sessionId))                            {                                PreLogoutSessionIdDictionary.Add(sessionId, new LifeValue(suid));                            }

                                LoginedUserIdDictionary.Remove(suid);                        }                    }                    else                    {                        LoginedUserIdDictionary.Add(sl.SigleUserLoginId, new LifeValue(context.Session.SessionID));                    }

                    }            }        }

            #endregion    }

        public class LifeValue    {        public string value;        public DateTime life;

            public LifeValue(string value)        {            this.value = value;            this.life = DateTime.Now.AddMinutes(HttpContext.Current.Session.Timeout + 5);        }    }    //public class StringLifeValueDictionary : Dictionary<string, LifeValue>    //{

        //}

        public class StringLifeValueDictionary : System.Collections.DictionaryBase    {        public LifeValue this[string key]        {            get            {                return (LifeValue)this.Dictionary[key];            }            set            {                this.Dictionary[key] = value;            }        }

            public void Add(string key, LifeValue value)        {            this.Dictionary.Add(key, value);        }

            public bool Contains(string key)        {            return this.Dictionary.Contains(key);        }

            public void Remove(string key)        {            this.Dictionary.Remove(key);        }

            public bool ContainsKey(string key)        {            return this.Dictionary.Contains(key);        }

            public IDictionaryEnumerator GetEnumerator()        {            return this.Dictionary.GetEnumerator();                     }

        }

        public interface ISingleLogin    {        string SigleUserLoginId { get; }

            void SigleUserLogout();

        }}

     

     

     <system.web>

       <httpModules>     <add name="SingleLogin" type="BNet.Web.Modulers.SingleLoginModuler"/>   </httpModules> </system.web>

     

    /// <summary>/// PageBaseNew 的摘要说明/// </summary>public class PageBaseNew : System.Web.UI.Page, BNet.Web.Modulers.ISingleLogin  { public PageBaseNew() {        this.Load += new System.EventHandler(PageBaseNew_Load);

     }    public interface ISingleLogin    {        string SigleUserLoginId { get; }

            void SigleUserLogout();

        }    private void PageBaseNew_Load(object sender, System.EventArgs e)     {                if (Session["userid"] == null)        {            Response.Write("<script language = javascript>window.parent.opener=null;window.open('" + BaseUrl + "Login.aspx','_top')</script>");//考虑到框架问题         }             }

        /*我的扩展*/    public string BaseUrl    {        get        {            string strBaseUrl = "";            strBaseUrl += "http://" + HttpContext.Current.Request.Url.Host;            if (HttpContext.Current.Request.Url.Port.ToString() != "80")            {                strBaseUrl += ":" + HttpContext.Current.Request.Url.Port.ToString();            }            strBaseUrl += HttpContext.Current.Request.ApplicationPath;            return strBaseUrl + "/";        }    }    public string SigleUserLoginId    {        get         {            if (Session["userid"] != null)            {                return Session["userid"].ToString();            }            else                return "";        }    }

        public void SigleUserLogout()    {        Session.Abandon();        Response.Write("你在别处已经登陆,强制退出本次登陆!");    }

    }

    转自:http://evlon.cnblogs.com/archive/2006/03/20/354191.html

     

    但是我自己遇到一个问题:

    就是repeaterURL分页的时候丢失SESSIONID

      <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="true" timeout="30"/>

     

    cookieless="true" 改成false

    true-->表示存储到URL中

    false-->表示存储到COOKIE中

     

     

     

     

     

     

     

    厦门德仔 认证博客专家 项目实施 软件开发 数据分析 毕业于南昌大学,拥有超过13年的工作经验,数据库工程师(中级),ERP认证工程师,FRCA报表工程师,PMP专业项目管理,具有项目管理能力,拥有多年项目实施与运维,精通SQL数据库,Asp.net和数据分析管理和开发。曾在台企,港企,美企,民企实施过多个完整ERP,WMS,EHR,OA,BI等项目。
    最新回复(0)