【问题标题】:send heartbeart by calling a jsp doesn't keep session alive通过调用 jsp 发送 heartbeart 不会使会话保持活动状态
【发布时间】:2011-06-25 19:15:55
【问题描述】:

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

  1. 在服务器端 (tomcat),会话超时设置为 8 分钟。
  2. main jsp 生成一个 html。在这个 html 中,我使用 timer & ajax 每 3 分钟调用一次heartbeat.jsp 并将初始会话 ID 的值传递给它。
  3. heartbeat.jsp 中,我转储session.getId() 的值和初始会话ID。

【执行结果时间线】:

  • 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 代码段]:

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

【问题讨论】:

  • 你不需要在请求中发送 sessionid 吗?很抱歉自从 jsp 以来太久了,但我认为那里有一个 sessionid 参数
  • 你能发布实际的客户端 HTML 和 JSP 代码吗?显然只有相关部分!
  • @Alex:我尝试heartbeat.jsp;jsessionid=...,但问题仍然存在。我确定在浏览器中启用了 cookie,所以通常(至少对于 firefox)web servr 应该将 set-cookie 发送到浏览器并且我不需要显式发送会话 ID,对吗? @Paul:我已经添加了代码段。

标签: jsp session keep-alive heartbeat


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 2012-02-06
    • 1970-01-01
    • 2014-06-20
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    相关资源
    最近更新 更多