在web開發時有的系統要求同一個用戶在同一時間只能登錄一次也就是如果一個用戶已經登錄了在退出之前如果再次登錄的話需要報錯
常見的處理方法是在用戶登錄時判斷此用戶是否已經在Application中存在如果存在就報錯不存在的話就加到Application中(Application是所有Session共有的整個web應用程序唯一的一個對象)
string strUserId = txtUserText;
ArrayList list = ApplicationGet(GLOBAL_USER_LIST) as ArrayList;
if (list == null)
list = new ArrayList();
for (int i = ; i < listCount; i++)
{
if (strUserId == (list[i] as string))
{
//已經登錄了提示錯誤信息
lblErrorText = 此用戶已經登錄;
return;
}
}
listAdd(strUserId);
ApplicationAdd(GLOBAL_USER_LIST list);當然這裡使用Cache等保存也可以
接下來就是要在用戶退出的時候將此用戶從Application中去除我們可以在Globalasax的Session_End事件中處理
void Session_End(object sender EventArgs e)
{
// 在會話結束時運行的代碼
// 注意: 只有在 nfig 文件中的 sessionstate 模式設置為
// InProc 時才會引發 Session_End 事件如果會話模式設置為 StateServer
// 或 SQLServer則不會引發該事件
string strUserId = Session[SESSION_USER] as string;
ArrayList list = ApplicationGet(GLOBAL_USER_LIST) as ArrayList;
if (strUserId != null && list != null)
{
listRemove(strUserId);
ApplicationAdd(GLOBAL_USER_LIST list);
這些都沒有問題有問題的就是當用戶直接點浏覽器右上角的關閉按鈕時就有問題了因為直接關閉的話並不會立即觸發Session過期事件也就是關閉浏覽器後再來登錄就登不進去了
這裡有兩種處理方式
使用JavaScript方式
在每一個頁面中加入一段javascript代碼
function windowonbeforeunload() {
if (eventclientX > documentbodyclientWidth &&eventclientY < || eventaltKey) {
windowopen(logoutASPx);
}
}
由於onbeforeunload方法在浏覽器關閉刷新頁面調轉等情況下都會被執行所以需要判斷是點擊了關閉按鈕或是按下Alt+F時才執行真正的關閉操作
然後在logoutaspx的Page_Load中寫和Session_End相同的方法同時在logoutaspx中加入事件onload=javascript:windowclose()
但是這樣還是有問題javascript在不同的浏覽器中可能有不同的行為還有就是當通過文件>關閉時沒有判斷到
使用xmlhttp方法(這種方法測試下來沒有問題)
在每個頁面中加入如下的javascript(這些javascript也可以寫在共通裡每個頁面引入就可以了)
var x = ;
function myRefresh() {
var httpRequest = new ActiveXObject(microsoftxmlx false);
(null);
x++;
if (x < ) //次也就是Session真正的過期時間是分鐘
{
setTimeout(myRefresh() * ); //秒
}
}
myRefresh();在nfig中設置
<sessionState mode=InProc timeout=></sessionState>testaspx
頁面就是一個空頁面只不過需要在Page_Load中加入ResponseExpires = ;
保證不使用緩存每次都能調用到這個頁面
原理就是設置Session的過期時間是一分鐘然後在每個頁面上定時每秒連接一次測試頁面
保持Session有效總共連 次也就是分鐘如果分鐘後用戶還沒有操作Session就會過期當然如果用戶直接關閉浏覽器那麼一分鐘後Session也會過期這樣就可以滿足要求了
From:http://tw.wingwit.com/Article/program/ASP/201311/21775.html