2011-03-24 123 views
1

如何在會話過期後自動重定向頁面,而無需在頁面上執行任何用戶操作。會話過期後自動重定向

+1

這是頁面特定的超時還是隻是一般會話超時? I.E.從某人登陸頁面,啓動計時器或創建會話時,啓動計時器?你可以使用ajax來ping服務器來檢查。或者在每個頁面的基礎上設置元刷新時間? – Alex 2011-03-24 10:11:01

+0

如果我每次打電話給ajax使用定時器和Ajax函數服務器會話將得到重新創建儀式..?我如何訪問會話變量與重新創建會話..? – SSN 2011-03-24 10:22:26

+0

如果您在第一次啓動會話時創建會話變量,您可以隨時通過調用session_start()來檢查此變量計時器。然後檢查$ _SESSION ['timer'];定時器將不會被重置,直到你積極重置它 – Alex 2011-03-24 10:40:31

回答

6

創建一個活動檢查器,該活動檢查器每隔一分鐘檢查是否發生了任何用戶活動(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

確實是你有史以來最好的答案之一,這應該在+1000 – 2013-05-17 16:12:38