日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Asp.net中防止用户多次登录的方法

發(fā)布時間:2025/5/22 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Asp.net中防止用户多次登录的方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

 在web開發(fā)時,有的系統(tǒng)要求同一個用戶在同一時間只能登錄一次,也就是如果一個用戶已經(jīng)登錄了,在退出之前如果再次登錄的話需要報錯。

  常見的處理方法是,在用戶登錄時,判斷此用戶是否已經(jīng)在Application中存在,如果存在就報錯,不存在的話就加到Application(Application是所有session共有的,整個web應(yīng)用程序唯一的一個對象)

以下是引用片段:
  string?strUserId?=?txtUser.Text;
  ArrayList?list?=?Application.Get("GLOBAL_USER_LIST")?as?ArrayList;
  if?(list?==?null)
  {
  list?=?new?ArrayList();
  }
  for?(int?i?=?0;?i?<?list.Count;?i++)
  {
  if?(strUserId?==?(list[i]?as?string))
  {
  //已經(jīng)登錄了,提示錯誤信息
  lblError.Text?=?"此用戶已經(jīng)登錄";
  return;
  }
  }
  list.Add(strUserId);
  Application.Add("GLOBAL_USER_LIST",?list);

  當(dāng)然這里使用Cache等保存也可以。

  接下來就是要在用戶退出的時候?qū)⒋擞脩魪?span lang="en-us">Application中去除,我們可以在Global.asaxsession_End事件中處理:

以下是引用片段:
  void?session_End(object?sender,?EventArgs?e)
  {
  //?在會話結(jié)束時運行的代碼。
  //?注意:?只有在?Web.config?文件中的?sessionstate?模式設(shè)置為
  //?InProc?時,才會引發(fā)?session_End?事件。如果會話模式設(shè)置為?StateServer
  //??SQLServer,則不會引發(fā)該事件
  string?strUserId?=?Session["session_USER"]?as?string;
  ArrayList?list?=?Application.Get("GLOBAL_USER_LIST")?as?ArrayList;
  if?(strUserId?!=?null?&&?list?!=?null)
  {
  list.Remove(strUserId);
  Application.Add("GLOBAL_USER_LIST",?list);
  }
  }

  這些都沒有問題,有問題的就是當(dāng)用戶直接點瀏覽器右上角的關(guān)閉按鈕時就有問題了。因為直接關(guān)閉的話,并不會立即觸發(fā)session過期事件,也就是關(guān)閉瀏覽器后再來登錄就登不進去了。

  這里有兩種處理方式:

  1、使用Javascript方式

  在每一個頁面中加入一段Javascript代碼:

以下是引用片段:
  function?window.onbeforeunload()
  {
  if?(event.clientX>document.body.clientWidth?&&?event.clientY<0||event.altKey){
  window.open("logout.aspx");
  }
  }

  由于onbeforeunload方法在瀏覽器關(guān)閉、刷新、頁面調(diào)轉(zhuǎn)等情況下都會被執(zhí)行,所以需要判斷是點擊了關(guān)閉按鈕或是按下Alt+F4時才執(zhí)行真正的關(guān)閉操作。

  然后在logout.aspxPage_Load中寫和session_End相同的方法,同時在logout.aspx中加入事件οnlοad="Javascript:window.close()"

  但是這樣還是有問題,Javascript在不同的瀏覽器中可能有不同的行為,還有就是當(dāng)通過文件->關(guān)閉時沒有判斷到。

  2、使用XMLhttp方法(這種方法測試下來沒有問題)

  在每個頁面中加入如下的javascript(這些Javascript也可以寫在共通里,每個頁面引入就可以了)

以下是引用片段:
  var?x=0;
  function?myRefresh()
  {
  var?httpRequest?=?new?ActiveXObject("microsoft.XMLhttp");
  httpRequest.open("GET",?"test.aspx",?false);
  httpRequest.send(null);
  x++;
  if(x<60)?//60次,也就是session真正的過期時間是30分鐘
  {
  setTimeout("myRefresh()",30*1000);?//30
  }
  }
  myRefresh();

  在web.config中設(shè)置

以下是引用片段:
<sessionState?mode="InProc"?timeout="1"></sessionState>?

  test.aspx頁面就是一個空頁面,只不過需要在Page_Load中加入:

以下是引用片段:
  Response.Expires?=?-1;

  保證不使用緩存,每次都能調(diào)用到這個頁面。

  原理就是:設(shè)置Session的過期時間是一分鐘,然后在每個頁面上定時每30秒連接一次測試頁面,保持Session有效,總共連60次,也就是30分鐘。如果30分鐘后用戶還沒有操作,Session就會過期。當(dāng)然,如果用戶直接關(guān)閉瀏覽器,那么一分鐘后session也會過期。這樣就可以滿足要求了。

?

轉(zhuǎn)載于:https://www.cnblogs.com/zwl12549/archive/2008/02/16/1070785.html

總結(jié)

以上是生活随笔為你收集整理的Asp.net中防止用户多次登录的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。