国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#有效防止同一賬號多次登錄(附三種方法)

2020-01-24 01:22:50
字體:
來源:轉載
供稿:網友

本文先為大家介紹如何利用緩存Cache方便地實現此功能。
Cache與Session這二個狀態對像的其中有一個不同之處,Cache是一個全局對象,作用的范圍是整個應用程序,所有用戶;
而Session是一個用戶會話對象,是局部對象,用于保存單個用戶的信息。
只要把每次用戶登錄后的用戶信息存儲在Cache中,把Cache的Key名設為用戶的登錄名,Cache的過期時間設置為Session的超時時間,在用戶每次登錄的時候去判斷一下Cache[用戶名]是否有值,如果沒有值,證明該用戶沒有登錄,否則該用戶已登錄。
為大家舉一個例子吧。

/// <summary>/// 防止多次登錄/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button1_Click(object sender, System.EventArgs e){string strUser = string.Empty;string strCacheKey = this.TextBox1.Text;strUser = Convert.ToString(Cache[strCacheKey]);if (strUser == string.Empty){TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);Cache.Insert(strCacheKey, strCacheKey, null, DateTime.MaxValue, SessTimeOut, CacheItemPriority.NotRemovable, null);Session["User"] = strCacheKey;this.Label1.Text = Session["User"].ToString();}else{this.Label1.Text = "這個用戶已經登錄!";}}

在網上又找了下,發現了另外兩種解決方案:
1、通過數據庫狀態位判斷該用戶是否已經登錄。
2、利用session監聽器監聽每一個登錄用戶的登錄情況。
第一種解決方案很簡單,但需要考慮用戶非正常退出的情況,如直接關閉瀏覽器等等,可用性較低。
接下來,主要介紹第二種方案的具體實現:利用session監聽器監聽每一個登錄用戶的登錄情況。
A.用戶登錄后,先去數據庫查詢該登錄名是否存在、是否鎖定,在登錄名存在且非鎖定的情況下,從application內置作用域對象中取出所有的登錄信息,查看該登錄名是否已經登錄,如果登錄了,就友好提示下;反之表示可以登錄,將該登錄信息保存在application中。
主要代碼如下:

////所有的登錄信息Map<String, String> loginUserMap = (Map<String, String>) super.getApplicationAttr(Constant.LOGIN_USER_MAP);boolean isExist = false;String sessionId = super.getSessionId(false);if(loginUserMap==null){loginUserMap = new HashMap<String, String>();}for (String username : loginUserMap.keySet()) {//判斷是否已經保存該登錄用戶的信息,是否為同一個用戶進行重復登錄if(!username.equals(user.getFuUserName()) || loginUserMap.containsValue(sessionId)){continue;}isExist = true;break;}if(isExist){//該用戶已登錄//}else {//該用戶沒有登錄loginUserMap.put(result.getFuUserName(), sessionId);//}//

B.登錄考慮完之后,來考慮考慮退出。
用戶正常退出時,我們需要將該用戶的登錄信息從session中移除。我們可以寫一個Session監聽器,監聽sessioon銷毀的時候,我們將登錄的用戶注銷掉,也就是從application中移除。表示該用戶已經下線了。

主要代碼如下:

//public void sessionDestroyed(HttpSessionEvent event) {   //    //在session銷毀的時候 把loginUserMap中保存的鍵值對清除   User user = (User)event.getSession().getAttribute("loginUser");   if(user!=null){     Map<String, String> loginUserMap = (Map<String, String>)event.getSession().getServletContext().getAttribute("loginUserMap");     loginUserMap.remove(user.getFuUserName()); event.getSession().getServletContext().setAttribute("loginUserMap",loginUserMap);   }   //} //

另外,還有一個問題,如果說登錄的用戶突然關閉了瀏覽器而沒有點擊退出按鈕。那么可以利用beforeunload 事件,在瀏覽器刷新或者關閉的時候觸發。

//在刷新或關閉時調用的事件$(window).bind('beforeunload',function(){ $.ajax({  url:"${ctx}/system/user/user!logout.action",  type:"post",  success:function(){   alert("您已退出登錄");  } });});

這樣基本就實現了需求。
大家可以把上面代碼運用到自己的項目中,檢測一下,有效的防止同一賬號的重復登錄,希望大家喜歡這些方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌审旗| 万载县| 望奎县| 武胜县| 仙桃市| 突泉县| 中江县| 星子县| 合作市| 吉林市| 天长市| 武陟县| 丹凤县| 山丹县| 米林县| 梓潼县| 铁力市| 靖西县| 泰兴市| 观塘区| 涟源市| 永春县| 万宁市| 渭南市| 酉阳| 武义县| 琼海市| 美姑县| 娄烦县| 宽甸| 舟山市| 务川| 聂荣县| 新邵县| 衡阳县| 海兴县| 朔州市| 黄山市| 大田县| 大田县| 土默特左旗|