2012-10-02 43 views
9

許多網站(銀行網站爲例) - 實施註銷+ 1個分鐘警告之前會話即將到期(20分鐘)在asp.net + jQuery中實現自動註銷+警告?

這個話題沒有太大的討論 - 唯一的問題我見過是使用asp.net成員 - 我不使用

每個用戶都會有一個session["lastActionTime"]

本屆大會將以更新到當前時間時:

  • 頁面加載
  • Ajax請求已執行(因用戶操作)

現在 - 在頁面加載時,我設置會話值。 (可以說是19:00)

此外,對於每個ajax請求(我的網站不創建回發 - 只有ajax jquery) - 我使用ASHX處理程序與IRequiresSessionState更新會話到當前時間。

我用的是這樣的:

jQuery(document).ajaxStart(function(){ 
    gotoHandlerAndUpdateSessionTime(); 
}) 

現在-the部分1分鐘警告消息之前( 「會話即將到期」):

每個Ajax返回事件或page load事件 - 我激活javascriptsetInterval[sessionTime-1]分鐘(20-1 = 19)。 (當然 - 取消所有先前setIntervals ...)

現在當事件(setInterval的)發生時 - 這是過期時間前1分鐘:(19分鐘)

我顯示警告的div,並且用戶可以選擇出口入住

問題:

1)如果在警告DIV用戶didnt按什麼,如何(1分鐘後,從顯示的div)我將記錄他出去?我應該在顯示div時打開setTimeout 1分鐘,然後(如果沒有按下)將他註銷?

2)這是做它的正確方法嗎?

3)這個奇怪的故事不應該有餅乾嗎? :-)

(請 - 無會員 - 或表格認證)。 我將這個問題也標記爲PHP,因爲我知道它也與PHP程序員有關,我想聽聽他們的知識。

回答

5

Royi,回答你的兩個問題,我會說YES。我已經創建了幾次(通常使用Forms Auth),但基本上你有一個計時器倒計時顯示第一個警告,然後另一個計時器倒計時並給用戶X秒的時間來回答。我通常會在警告信息上放下第二個數字,以便他們能看到他們離開了多少時間。如果他們在分配的時間內沒有回答,則會調用Logout.ashx(或其他)來破壞會話,然後JavaScript可以將它們重定向回登錄頁面。我希望有所幫助。

關於你的第三個問題,只要你跟蹤會話,你不應該真的需要cookies。只需在PHP中執行session_destroy()或在JavaScript定時器倒數時在C#中執行Session.Abandon()。

下面是一些代碼,我使用我的網站之一(可能不是最乾淨的,但你的想法):

var timeoutPolled = 0; 
var timeoutSeconds = 10; 
var countDownCounter = 61; 
var timeoutBetweenPolls = 5000; 
var stopCountDown = false; 

function InitializePollTimer(timeoutMinutes) { 
    timeoutSeconds = timeoutMinutes * 60; 

    StartPollTimer(); 
} 

function StartPollTimer() { 
    setTimeout(PollForTimeout, timeoutBetweenPolls); 
} 

function PollForTimeout() { 
    timeoutPolled++; 

    if ((timeoutPolled * timeoutBetweenPolls) > 1 * (timeoutSeconds * 1000)) { 
     $("#timeoutDialog").dialog({ 
      autoOpen: false, 
      bgiframe: true, 
      resizable: false, 
      height: 250, 
      draggable: false, 
      modal: true, 
      zindex: 99999999, 
      position: 'top', 
      open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); },  
      buttons: { 
       "Continue using Website?": function() { 
        StopCountDown(); 

        $.ajax({ 
         type: "GET", 
         url: "RefreshSession.aspx", 
         cache: false 
        }); 

        $(this).dialog("close"); 

        timeoutPolled = 0; 
        StartPollTimer(); 
       }, 
       "Logout": function() { 
        Logout(); 
       } 
      } 
     }); 

     $("#timeoutDialog").dialog("open"); 

     countDownCounter = 61; 

     CountDown(); 
    } 
    else { 
     StartPollTimer(); 
    } 
} 

function CountDown() { 
    if (stopCountDown) { 
     stopCountDown = false; 
    } 
    else { 
     countDownCounter--; 
     $("#countdownTimer").html(countDownCounter); 

     if (countDownCounter > 0) { 
      setTimeout(CountDown, 950); 
     } 
     else { 
      Logout(); 
     } 
    } 
} 

function StopCountDown() { 
    stopCountDown = true; 
} 

function Logout() { 
    window.location.href = 'Logout.aspx'; 
} 
+0

你到底是怎麼看我的問題:-)你必須多做一遍:-) –

+0

mmmm ..所以我想着正確的方式....對吧?請注意我的第三個問題:-) –

+1

是的,我會說你絕對是在正確的軌道上。我添加了一些代碼和對第三個問題的迴應。實際上,我設置了一個1秒計時器,在19分鐘倒計時後被調用60次,這樣我就可以更新顯示倒計時剩餘秒數的時間間隔。 –

1

這是可能的,我不會告訴你任何你不't已經知道,但這裏是我的兩分錢無論如何 -

在用戶沒有按下警告按鈕有兩個區域:(1)當前顯示在屏幕上的信息(2)更多的信息被阻止的額外請求 - 對於第一種情況,JavaScript定時器應該轉發到LoggedOut頁面,如果沒有被點擊警告對話框和s其次,服務器端邏輯應該檢查當前登錄用戶的上下文請求。

至於cookie,聽起來好像你已經使用過,如果你沒有改變會話狀態的默認設置 - 我認爲它被稱爲.ASPNET,但我可能是錯誤的,你可以檢查代理工具。

+0

這將是unpersistant cookie,aspnet_sessionid但我在想像存儲時間或東西在裏面...仍然我不明白爲什麼其他請求會被阻止?我沒有提醒imdisplaying div :-) –