отправить heartbeart, вызвав JSP не поддерживает сессию - PullRequest
0 голосов
/ 11 февраля 2011

Я хочу сохранить сеанс, когда я открываю веб-страницу в браузере, даже если я ее долго не трогаю, вот что я пытаюсь сделать:

  1. на стороне сервера (tomcat), время ожидания сеанса установлено на 8 минут.
  2. main JSP генерирует HTML.В этом html я использую timer & ajax для вызова heartbeat.jsp каждые 3 минуты, а также передаю ему начальное значение идентификатора сеанса.
  3. В heartbeat.jsp я высылаю значение session.getId() и идентификатор начальной сессии.

[временная шкала результата выполнения]:

  • 10:00 Я открываю страницу - основная jsp-программа генерирует html клиента
  • 10:03 heartbeat.jsp звонил - session.getId() = исходный идентификатор сеанса
  • 10:06 heartbeat.jsp звонил - session.getId() = исходный идентификатор сеанса
  • 10:09 heartbeat.jsp звонил - session.getId() <> начальный идентификатор сеанса

время последнего доступа к исходному идентификатору сеанса равно 10:06, поэтому время ожидания исходного идентификатора сеанса предполагается равным 10:14.Но почему в 10:09, session.getId() получить еще один новый идентификатор?

Кажется, что первые 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");

1 Ответ

0 голосов
/ 03 марта 2011

Я решил эту проблему поддержания сеанса с помощью синхронизированного фонового вызова jquery ajax на пустую страницу - сервер получает запрос каждые x секунд в фоновом режиме.Jquery может быть проще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...