2010-07-08 142 views
5

我們的應用程序在30分鐘後註銷並重定向到登錄頁面,我在web.xml中指定會話超時並使用requestProcessor進行重定向。我想向用戶顯示一條消息,一旦會話過期,你的會話過期了,我該怎麼做。自動註銷? 我想在頁面上提示錯誤信息「會話超時,請重新登錄」。那我怎麼能檢測到會話超時?任何方法會自動觸發嗎?會話過期後自動註銷

回答

9

創建一個活動檢查器,該活動檢查器每分鐘檢查是否發生任何用戶活動(mouseclick,keypress),並向服務器端執行檢測信號,以便在用戶處於活動狀態時保持會話活動狀態,而當用戶不活動時不執行任何操作活性。當30分鐘內沒有活動(或者在服務器端設置了默認的會話超時時間)時,請執行重定向。

下面是一個啓動示例,幾乎沒有jQuery的幫助來綁定點擊和按鍵事件並激發ajax請求。

<script src="http://code.jquery.com/jquery-latest.min.js"></script> 
<script> 
    $(document).ready(function() { 
     $.active = false; 
     $('body').bind('click keypress', function() { $.active = true; }); 
     checkActivity(1800000, 60000, 0); // timeout = 30 minutes, interval = 1 minute. 
    }); 

    function checkActivity(timeout, interval, elapsed) { 
     if ($.active) { 
      elapsed = 0; 
      $.active = false; 
      $.get('heartbeat'); 
     } 
     if (elapsed < timeout) { 
      elapsed += interval; 
      setTimeout(function() { 
       checkActivity(timeout, interval, elapsed); 
      }, interval); 
     } else { 
      window.location = 'http://example.com/expired'; // Redirect to "session expired" page. 
     } 
    } 
</script> 

創建Servlet它偵聽/heartbeat和做基本上只是執行以下操作:

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) { 
    request.getSession(); 
} 

保持會話活着。

當您將登錄用戶存儲在會話中時,只要會話過期,它將「自動」註銷。所以你不需要手動註銷用戶。

+0

我希望顯示警報消息30分鐘後,如何更改上述腳本,我已在web.xml中定義會話超時 – sarah 2010-07-09 09:21:25

+0

即使應用程序正在使用,此腳本也會彈出。 – sarah 2010-07-10 05:07:37

+0

當您在同一個會話中打開多個窗口時,確實會發生這種情況。這是一個基本的開球的例子。你需要更進一步。只要用戶處於活動狀態,向服務器端發送ajaxical輪詢以保持會話活動。你可以在[我的其他答案]中找到一個例子(http://stackoverflow.com/questions/2319020/mvc-with-jquery-handling-session-expire/2319211#2319211)。 – BalusC 2010-07-10 05:16:16

0

如果您使用的是servlet會話,則可以使用isNew()方法檢查jsp/servlet正在返回的會話是否是新會話。如果是,則用戶的會話已過期,您可以顯示相關消息。

+0

用戶會話過期消息必須在超時後顯示,在您的情況下,它將顯示即使註銷後,我不需要 – sarah 2010-07-08 09:09:23

2

創建監聽類實現HttpSessionListener,並在web.xml

定義它時,任何會話被銷燬這會通知您。使用sessionDestroyed()方法。

見一個完整的例子在這裏:

http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/

+1

上述解決方案不會強制瀏覽器顯示對話框。 – 2010-07-08 09:57:44

+0

上述解決方案將強制應用程序提示即使註銷後的消息,它也不會檢查到期時間,比如說30分鐘,並顯示消息 – sarah 2010-07-08 11:28:02

0

包括你的JSP中一個JavaScript實用功能和ping服務器每31分鐘。 上面提到的實用函數應該在內部使用setTimeout()JS函數。

setTimeout ("checkServerSession()", /* intervalInMilliSeconds */ 31000); 

注意

checkServerSession()

是一個普通的JS功能,可能會觸發HTTP請求。如果請求成功,則會話存在,否則向用戶顯示提示。

+0

讓我知道一個例子,該如何起作用 – sarah 2010-07-08 11:29:26