欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2015年11月18日 17:14:22   作者:熊灬孩灬子  
這篇文章主要介紹了C#有效防止同一賬號(hào)多次登錄的方法,有效防止同一賬號(hào)多次登錄的方法很多,比如用數(shù)據(jù)庫(kù)來(lái)記錄用戶(hù)登錄情況、用Application來(lái)保存用戶(hù)登錄信息、用Cache來(lái)保存信息等,感興趣的小伙伴們可以參考一下

本文先為大家介紹如何利用緩存Cache方便地實(shí)現(xiàn)此功能。
Cache與Session這二個(gè)狀態(tài)對(duì)像的其中有一個(gè)不同之處,Cache是一個(gè)全局對(duì)象,作用的范圍是整個(gè)應(yīng)用程序,所有用戶(hù);
而Session是一個(gè)用戶(hù)會(huì)話(huà)對(duì)象,是局部對(duì)象,用于保存單個(gè)用戶(hù)的信息。
只要把每次用戶(hù)登錄后的用戶(hù)信息存儲(chǔ)在Cache中,把Cache的Key名設(shè)為用戶(hù)的登錄名,Cache的過(guò)期時(shí)間設(shè)置為Session的超時(shí)時(shí)間,在用戶(hù)每次登錄的時(shí)候去判斷一下Cache[用戶(hù)名]是否有值,如果沒(méi)有值,證明該用戶(hù)沒(méi)有登錄,否則該用戶(hù)已登錄。
為大家舉一個(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è)用戶(hù)已經(jīng)登錄!";
}
}

在網(wǎng)上又找了下,發(fā)現(xiàn)了另外兩種解決方案:
1、通過(guò)數(shù)據(jù)庫(kù)狀態(tài)位判斷該用戶(hù)是否已經(jīng)登錄。
2、利用session監(jiān)聽(tīng)器監(jiān)聽(tīng)每一個(gè)登錄用戶(hù)的登錄情況。
第一種解決方案很簡(jiǎn)單,但需要考慮用戶(hù)非正常退出的情況,如直接關(guān)閉瀏覽器等等,可用性較低。
接下來(lái),主要介紹第二種方案的具體實(shí)現(xiàn):利用session監(jiān)聽(tīng)器監(jiān)聽(tīng)每一個(gè)登錄用戶(hù)的登錄情況。
A.用戶(hù)登錄后,先去數(shù)據(jù)庫(kù)查詢(xún)?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)保存該登錄用戶(hù)的信息,是否為同一個(gè)用戶(hù)進(jìn)行重復(fù)登錄
if(!username.equals(user.getFuUserName()) || loginUserMap.containsValue(sessionId)){
continue;
}
isExist = true;
break;
}
if(isExist){
//該用戶(hù)已登錄
//
}else {
//該用戶(hù)沒(méi)有登錄
loginUserMap.put(result.getFuUserName(), sessionId);
//
}
//

B.登錄考慮完之后,來(lái)考慮考慮退出。
用戶(hù)正常退出時(shí),我們需要將該用戶(hù)的登錄信息從session中移除。我們可以寫(xiě)一個(gè)Session監(jiān)聽(tīng)器,監(jiān)聽(tīng)sessioon銷(xiāo)毀的時(shí)候,我們將登錄的用戶(hù)注銷(xiāo)掉,也就是從application中移除。表示該用戶(hù)已經(jīng)下線(xiàn)了。

主要代碼如下:

//
public void sessionDestroyed(HttpSessionEvent event) { 
  //  
  //在session銷(xiāo)毀的時(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è)問(wèn)題,如果說(shuō)登錄的用戶(hù)突然關(guān)閉了瀏覽器而沒(méi)有點(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ù)登錄,希望大家喜歡這些方法。

相關(guān)文章

  • winform關(guān)閉窗體FormClosing事件用法介紹

    winform關(guān)閉窗體FormClosing事件用法介紹

    這篇文章介紹了winform關(guān)閉窗體FormClosing事件的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • WPF實(shí)現(xiàn)XAML轉(zhuǎn)圖片的示例詳解

    WPF實(shí)現(xiàn)XAML轉(zhuǎn)圖片的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用WPF實(shí)現(xiàn)XAML轉(zhuǎn)圖片,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2022-11-11
  • 使用C#實(shí)現(xiàn)一個(gè)簡(jiǎn)單的繪圖工具

    使用C#實(shí)現(xiàn)一個(gè)簡(jiǎn)單的繪圖工具

    這篇文章主要為大家詳細(xì)介紹了如何使用C#開(kāi)發(fā)的簡(jiǎn)單繪圖工具,可以將簽名簡(jiǎn)單繪圖后的效果以圖片的形式導(dǎo)出,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • 如何利用c#實(shí)現(xiàn)通用守護(hù)進(jìn)程

    如何利用c#實(shí)現(xiàn)通用守護(hù)進(jìn)程

    這篇文章主要給大家介紹了關(guān)于如何利用c#實(shí)現(xiàn)通用守護(hù)進(jìn)程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • C# wpf Brush轉(zhuǎn)Hex字符串的實(shí)例代碼

    C# wpf Brush轉(zhuǎn)Hex字符串的實(shí)例代碼

    這篇文章主要介紹了C# wpf Brush轉(zhuǎn)Hex字符串的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • VS2019打包WPF安裝程序最新教程(圖文詳解)

    VS2019打包WPF安裝程序最新教程(圖文詳解)

    這篇文章主要介紹了VS2019打包WPF安裝程序最新教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • C#中Invoke和BeginInvoke區(qū)別小結(jié)

    C#中Invoke和BeginInvoke區(qū)別小結(jié)

    有時(shí)候,我們不得不跨線(xiàn)程調(diào)用主界面的控件來(lái)進(jìn)行操作,所以為了方便的解決問(wèn)題,.net為我們提供了Invoke?與beginInvoke,那么Invoke和BeginInvoke區(qū)別在哪,本文就來(lái)詳細(xì)的介紹一下
    2023-08-08
  • unity通過(guò)Mesh網(wǎng)格繪制圖形(三角形、正方體、圓柱)

    unity通過(guò)Mesh網(wǎng)格繪制圖形(三角形、正方體、圓柱)

    這篇文章主要為大家詳細(xì)介紹了unity通過(guò)Mesh網(wǎng)格繪制圖形:三角形、正方體、圓柱,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C# Bitmap 復(fù)制的小例子

    C# Bitmap 復(fù)制的小例子

    這篇文章介紹了C# Bitmap 復(fù)制的小例子,有需要的朋友可以參考一下
    2013-10-10
  • C#字體池技術(shù)實(shí)現(xiàn)代碼詳解

    C#字體池技術(shù)實(shí)現(xiàn)代碼詳解

    在本篇文章里小編給大家整理的是關(guān)于C#字體池技術(shù)實(shí)現(xiàn)代碼詳解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2019-11-11

最新評(píng)論