判斷此使用者是否已經在Application中存在,如果存在就報錯,不存在的話就加到Application中(Application是所有Session共有的,整個web應用唯一的一個對象):
以下是引用片段: 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)) //已經登入了,提示錯誤資訊 lblError.Text = "此使用者已經登入"; return; list.Add(strUserId); Application.Add("GLOBAL_USER_LIST", list); |
當然這裡使用Cache等儲存也可以。
接下來就是要在使用者退出的時候将此使用者從Application中去除,我們可以在Global.asax的Session_End事件中處理:
void Session_End(object sender, EventArgs e) // 在會話結束時運作的代碼。 // 注意: 隻有在 Web.config 檔案中的 sessionstate 模式設定為 // InProc 時,才會引發 Session_End 事件。如果會話模式設定為 StateServer // 或 SQLServer,則不會引發該事件。 string strUserId = Session["SESSION_USER"] as string; if (strUserId != null && list != null) list.Remove(strUserId); Application.Add("GLOBAL_USER_LIST", list); } |
這些都沒有問題,有問題的就是當使用者直接點浏覽器右上角的關閉按鈕時就有問題了。因為直接關閉的話,并不會立即觸發Session過期事件,也就是關閉浏覽器後再來登入就登不進去了。
這裡有兩種處理方式:
1、使用JavaScript方式
在每一個頁面中加入一段javascript代碼:
function window.onbeforeunload() if (event.clientX>document.body.clientWidth && event.clientY<0||event.altKey){ window.open("logout.ASPx"); |