0

長時間触れていなくても、ブラウザでWebページを開いたときにセッションを維持したいのですが、これが私がやろうとしている方法です:

  1. サーバー側 (Tomcat) では、セッション タイムアウトが 8 分に設定されています。
  2. main jsp は html を生成します。このhtmlでは、タイマーとajaxを使用しheartbeat.jspて3分ごとに呼び出し、初期セッションIDの値も渡します。
  3. では、の値と初期セッション ID heartbeat.jspをダンプします。session.getId()

【実行結果のタイムライン】:

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

1 に答える 1

0

時間指定されたバックグラウンド jquery ajax を空白ページに呼び出すことで、このキープ セッション アライブの問題を解決しました。その後、サーバーはバックグラウンドで x 秒ごとにリクエストを受信します。Jquery の方が簡単かもしれません。

于 2011-03-03T18:17:37.317 に答える