通过调用jsp发送heartbeart不会使会话保持活动状态

时间:2011-02-11 20:07:32

标签: jsp session keep-alive heartbeat

我想在浏览器上打开网页时保持会话活动,即使我长时间没有触摸它,这就是我尝试的方式:

  1. 在服务器端(tomcat),会话超时设置为8分钟。
  2. 主jsp生成一个html。在这个HTML中,我使用计时器& ajax每3分钟拨打一次heartbeat.jsp&还将初始会话id的值传递给它。
  3. heartbeat.jsp中,我转储session.getId()的价值&初始会话ID。
  4. [执行结果的时间表]:

    • 10:00我打开页面 - 主jsp程序生成客户端html
    • 10:03 heartbeat.jsp已调出 - session.getId() =初始会话ID
    • 10:06 heartbeat.jsp已调出 - session.getId() =初始会话ID
    • 10:09 heartbeat.jsp已调出 - session.getId()<>初始会话ID

    初始会话ID的最后访问时间为10:06,因此初始会话ID的超时时间为10:14。但为什么在10:09session.getId()获得另一个新ID?

    似乎前2次调用没有重置服务器端的初始会话超时计数器。我在IE和Firefox中测试它们,它们有相同的结果

    如何让会话保持活力?

    [主要的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 code seg]:

      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");
    

1 个答案:

答案 0 :(得分:0)

我通过定时后台jquery ajax调用空白页解决了这个保持会话活动问题 - 服务器在后台每x秒接收一个请求。 Jquery可能更简单吗?