通过调用jsp命令发送heartbeart';我不能让会话保持活动状态

通过调用jsp命令发送heartbeart';我不能让会话保持活动状态,jsp,session,keep-alive,heartbeat,Jsp,Session,Keep Alive,Heartbeat,当我在浏览器上打开网页时,即使我长时间不触摸它,我也希望保持会话的活动状态,这就是我试图做到的: 在服务器端(tomcat),会话超时设置为8分钟 主jsp生成一个html。在这个html中,我使用定时器和ajax每3分钟调用一次heartbeat.jsp,并将初始会话id的值传递给它 在heartbeat.jsp中,我转储session.getId()的值和初始会话id [执行结果时间表]: 10:00I打开页面——主jsp程序生成客户端html 10:03heartbeat.jsp调用--

当我在浏览器上打开网页时,即使我长时间不触摸它,我也希望保持会话的活动状态,这就是我试图做到的:

  • 在服务器端(tomcat),会话超时设置为8分钟
  • 主jsp生成一个html。在这个html中,我使用定时器和ajax每3分钟调用一次
    heartbeat.jsp
    ,并将初始会话id的值传递给它
  • heartbeat.jsp
    中,我转储
    session.getId()
    的值和初始会话id
  • [执行结果时间表]:

    • 10:00
      I打开页面——主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:09
    session.getId()
    获取另一个新id

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

    我怎样才能使会话永远保持有效

    [主jsp代码seg]:

    <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>
    

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

    您不需要在请求中发送sessionid吗?很抱歉,从jsp开始已经太久了,但我认为有一个sessionid参数,您可以发布实际的客户端HTML和jsp代码吗?显然,只有相关部分@亚历克斯:我尝试
    heartbeat.jsp;jsessionid=…
    但问题仍然存在。我确信浏览器中启用了cookie,所以通常(至少对于firefox而言)web servr应该将set cookie发送到浏览器&我不需要显式发送会话id,对吗@保罗:我添加了代码段。
      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");