C#有效防止同一賬號(hào)多次登錄(附三種方法)
本文先為大家介紹如何利用緩存Cache方便地實(shí)現(xiàn)此功能。
Cache與Session這二個(gè)狀態(tài)對(duì)像的其中有一個(gè)不同之處,Cache是一個(gè)全局對(duì)象,作用的范圍是整個(gè)應(yīng)用程序,所有用戶;
而Session是一個(gè)用戶會(huì)話對(duì)象,是局部對(duì)象,用于保存單個(gè)用戶的信息。
只要把每次用戶登錄后的用戶信息存儲(chǔ)在Cache中,把Cache的Key名設(shè)為用戶的登錄名,Cache的過期時(shí)間設(shè)置為Session的超時(shí)時(shí)間,在用戶每次登錄的時(shí)候去判斷一下Cache[用戶名]是否有值,如果沒有值,證明該用戶沒有登錄,否則該用戶已登錄。
為大家舉一個(gè)例子吧。
/// <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 = "這個(gè)用戶已經(jīng)登錄!";
}
}
在網(wǎng)上又找了下,發(fā)現(xiàn)了另外兩種解決方案:
1、通過數(shù)據(jù)庫狀態(tài)位判斷該用戶是否已經(jīng)登錄。
2、利用session監(jiān)聽器監(jiān)聽每一個(gè)登錄用戶的登錄情況。
第一種解決方案很簡單,但需要考慮用戶非正常退出的情況,如直接關(guān)閉瀏覽器等等,可用性較低。
接下來,主要介紹第二種方案的具體實(shí)現(xiàn):利用session監(jiān)聽器監(jiān)聽每一個(gè)登錄用戶的登錄情況。
A.用戶登錄后,先去數(shù)據(jù)庫查詢?cè)摰卿浢欠翊嬖?、是否鎖定,在登錄名存在且非鎖定的情況下,從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)保存該登錄用戶的信息,是否為同一個(gè)用戶進(jìn)行重復(fù)登錄
if(!username.equals(user.getFuUserName()) || loginUserMap.containsValue(sessionId)){
continue;
}
isExist = true;
break;
}
if(isExist){
//該用戶已登錄
//
}else {
//該用戶沒有登錄
loginUserMap.put(result.getFuUserName(), sessionId);
//
}
//
B.登錄考慮完之后,來考慮考慮退出。
用戶正常退出時(shí),我們需要將該用戶的登錄信息從session中移除。我們可以寫一個(gè)Session監(jiān)聽器,監(jiān)聽sessioon銷毀的時(shí)候,我們將登錄的用戶注銷掉,也就是從application中移除。表示該用戶已經(jīng)下線了。
主要代碼如下:
//
public void sessionDestroyed(HttpSessionEvent event) {
//
//在session銷毀的時(shí)候 把loginUserMap中保存的鍵值對(duì)清除
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);
}
//
}
//
另外,還有一個(gè)問題,如果說登錄的用戶突然關(guān)閉了瀏覽器而沒有點(diǎn)擊退出按鈕。那么可以利用beforeunload 事件,在瀏覽器刷新或者關(guān)閉的時(shí)候觸發(fā)。
//在刷新或關(guān)閉時(shí)調(diào)用的事件
$(window).bind('beforeunload',function(){
$.ajax({
url:"${ctx}/system/user/user!logout.action",
type:"post",
success:function(){
alert("您已退出登錄");
}
});
});
這樣基本就實(shí)現(xiàn)了需求。
大家可以把上面代碼運(yùn)用到自己的項(xiàng)目中,檢測(cè)一下,有效的防止同一賬號(hào)的重復(fù)登錄,希望大家喜歡這些方法。
- C#實(shí)現(xiàn)簡單的登錄界面
- C# Winform中實(shí)現(xiàn)主窗口打開登錄窗口關(guān)閉的方法
- C#實(shí)現(xiàn)的三種模擬自動(dòng)登錄和提交POST信息的方法
- C#.NET實(shí)現(xiàn)網(wǎng)頁自動(dòng)登錄的方法
- C#使用WebClient登錄網(wǎng)站并抓取登錄后的網(wǎng)頁信息實(shí)現(xiàn)方法
- .NET C#使用微信公眾號(hào)登錄網(wǎng)站
- C#使用HttpWebRequest與HttpWebResponse模擬用戶登錄
- C#可用于登錄驗(yàn)證碼的四位隨機(jī)數(shù)生成方法
- C#實(shí)現(xiàn)登錄窗口(不用隱藏)
- C#中實(shí)現(xiàn)登錄功能的完整步驟
相關(guān)文章
解析從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)擴(kuò)容機(jī)制的詳解
本篇文章是對(duì)從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)擴(kuò)容機(jī)制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C# CAD SelectionFilter下TypedValue數(shù)組使用方式
這篇文章主要介紹了C# CAD SelectionFilter下TypedValue數(shù)組使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
C#使用游標(biāo)實(shí)現(xiàn)補(bǔ)間函數(shù)
這篇文章主要為大家詳細(xì)介紹了C#使用游標(biāo)實(shí)現(xiàn)補(bǔ)間函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

