您当前的位置: 首页 >  http

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

发布时间:2011-02-16 12:45:00 ,浏览量:0

转自

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 {     /**     /// SingleLoginModuler 的摘要说明     ///     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             {                 ListlistRemove = new List();                 //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     //{

    //}

    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();

    } }

 

            

/// /// PageBaseNew 的摘要说明 /// 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("");//考虑到框架问题           }              }

    /*我的扩展*/     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

  

cookieless="true" 改成false

true-->表示存储到URL中

false-->表示存储到COOKIE中

关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    103089博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0502s