2011-02-11 79 views
0

我想在瀏覽器上打開網頁時保持會話仍然活着,即使長時間沒有觸摸它,我也會這樣做:通過調用jsp發送heartbeart不會保持會話活動

  1. 在服務器端(tomcat),會話超時設置爲8分鐘。
  2. main jsp生成一個html。在這個html中,我使用計時器& ajax每3分鐘致電heartbeat.jsp &也將初始會話ID的值傳遞給它。
  3. heartbeat.jsp,我轉儲session.getId()的值&初始會話ID。

[執行結果的時間表]:

  • 10:00我打開頁 - 主JSP程序產生客戶端的HTML
  • 10:03heartbeat.jsp稱爲 - session.getId() =初始會話ID
  • 10:06heartbeat.jsp稱爲 - session.getId() =初始會話ID
  • 10:09heartbeat.jsp稱爲 - session.getId() <>初始會話ID

inital會話ID的上次訪問時間爲10:06,所以初始會話ID的超時時間是在10:14應該。但爲什麼在10:09,session.getId()得到另一個新的ID?

看起來前2個調用沒有重置服務器端的初始會話超時計數器。我在IE和Firefox上都測試了這兩個結果,他們有相同的結果

我該如何讓session保持良好狀態?

[主JSP代碼賽格]:

<script type="text/javascript" src="/fp/js/prototype.js"></script> 
<script type="text/javascript" src="/fp/js/jquery.min.js"></script> 
<script type="text/javascript" src="/fp/js/jquery.roundabout.min.js"></script> 
<script type="text/javascript"> 
    function heartbeats(sid) { 
    var url = '/test/heartbeat.jsp' + '?rn=' + Math.random() +'&mysid='+sid; 
    var myAjax = new Ajax.Request(url,{ 
     method: 'get', 
     onFailure: function(request) { 
     alert("connect problem, can't do heartbeat!"); 
     }, 
     onSuccess: function(response) { 
     if (response.responseText.indexOf("timeout") != -1) { 
      alert("original session is expired"); 
     } 
     } 
    }); 
    } 
    function init_heartbeat(sid) { 
    new PeriodicalExecuter(function(startHeart){heartbeats(sid);}, 60*3); 
    } 
    init_heartbeat("<%=session.getId()%>"); 
</script> 

[heartbeat.jsp代碼賽格]:

String server_sid = (String)session.getId(); 
    String client_sid = 
    request.getParameter("mysid")==null?"":(String)request.getParameter("mysid"); 
    java.util.Calendar calendar = java.util.Calendar.getInstance(); 
    File lf = new File("/usr/tmp/hb.log");  
    try { 
    lf.println("servre sid = "+server_sid); 
    lf.println("client sid = "+client_sid); 
    lf.println("~~~~~"); 
    lf.close(); 
    } catch(Exception e) { 
    out.print(e); 
    } 
    if(!server_sid.equals(client_sid)) 
    out.print("timeout"); 
+0

您是否需要發送sessionid與您的請求?對不起,因爲jsp太久了,但我認爲那裏有sessionid參數 – Alex 2011-02-11 20:13:06

回答

0

我解決了這個保持會話活着問題與定時背景jQuery的Ajax調用一空白頁面 - 服務器在後臺每隔x秒接收一個請求。 jquery可能更簡單?