C#有用避免統一賬號屢次登錄(附三種辦法)。本站提示廣大學習愛好者:(C#有用避免統一賬號屢次登錄(附三種辦法))文章只能為提供參考,不一定能成為您想要的結果。以下是C#有用避免統一賬號屢次登錄(附三種辦法)正文
本文先為年夜家引見若何應用緩存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("您已加入登錄"); } }); });
如許根本就完成了需求。
年夜家可以把下面代碼應用到本身的項目中,檢測一下,有用的避免統一賬號的反復登錄,願望年夜家愛好這些辦法。