C#有效防止同一賬號多次登錄(附三種方法)
本文先為大家介紹如何利用緩存Cache方便地實現(xiàn)此功能。
Cache與Session這二個狀態(tài)對像的其中有一個不同之處,Cache是一個全局對象,作用的范圍是整個應(yīng)用程序,所有用戶;
而Session是一個用戶會話對象,是局部對象,用于保存單個用戶的信息。
只要把每次用戶登錄后的用戶信息存儲在Cache中,把Cache的Key名設(shè)為用戶的登錄名,Cache的過期時間設(shè)置為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 = "這個用戶已經(jīng)登錄!"; } }
在網(wǎng)上又找了下,發(fā)現(xiàn)了另外兩種解決方案:
1、通過數(shù)據(jù)庫狀態(tài)位判斷該用戶是否已經(jīng)登錄。
2、利用session監(jiān)聽器監(jiān)聽每一個登錄用戶的登錄情況。
第一種解決方案很簡單,但需要考慮用戶非正常退出的情況,如直接關(guān)閉瀏覽器等等,可用性較低。
接下來,主要介紹第二種方案的具體實現(xiàn):利用session監(jiān)聽器監(jiān)聽每一個登錄用戶的登錄情況。
A.用戶登錄后,先去數(shù)據(jù)庫查詢該登錄名是否存在、是否鎖定,在登錄名存在且非鎖定的情況下,從application內(nèi)置作用域?qū)ο笾腥〕鏊械牡卿浶畔?,查看該登錄名是否已?jīng)登錄,如果登錄了,就友好提示下;反之表示可以登錄,將該登錄信息保存在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()) { //判斷是否已經(jīng)保存該登錄用戶的信息,是否為同一個用戶進行重復(fù)登錄 if(!username.equals(user.getFuUserName()) || loginUserMap.containsValue(sessionId)){ continue; } isExist = true; break; } if(isExist){ //該用戶已登錄 // }else { //該用戶沒有登錄 loginUserMap.put(result.getFuUserName(), sessionId); // } //
B.登錄考慮完之后,來考慮考慮退出。
用戶正常退出時,我們需要將該用戶的登錄信息從session中移除。我們可以寫一個Session監(jiān)聽器,監(jiān)聽sessioon銷毀的時候,我們將登錄的用戶注銷掉,也就是從application中移除。表示該用戶已經(jīng)下線了。
主要代碼如下:
// 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); } // } //
另外,還有一個問題,如果說登錄的用戶突然關(guān)閉了瀏覽器而沒有點擊退出按鈕。那么可以利用beforeunload 事件,在瀏覽器刷新或者關(guān)閉的時候觸發(fā)。
//在刷新或關(guān)閉時調(diào)用的事件 $(window).bind('beforeunload',function(){ $.ajax({ url:"${ctx}/system/user/user!logout.action", type:"post", success:function(){ alert("您已退出登錄"); } }); });
這樣基本就實現(xiàn)了需求。
大家可以把上面代碼運用到自己的項目中,檢測一下,有效的防止同一賬號的重復(fù)登錄,希望大家喜歡這些方法。
您可能感興趣的文章


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個骰子