長時間触れていなくても、ブラウザでWebページを開いたときにセッションを維持したいのですが、これが私がやろうとしている方法です:
- サーバー側 (Tomcat) では、セッション タイムアウトが 8 分に設定されています。
- main jsp は html を生成します。このhtmlでは、タイマーとajaxを使用し
heartbeat.jsp
て3分ごとに呼び出し、初期セッションIDの値も渡します。 - では、の値と初期セッション ID
heartbeat.jsp
をダンプします。session.getId()
【実行結果のタイムライン】:
10:00
ページを開く -- メインの jsp プログラムがクライアント html を生成する10:03
heartbeat.jsp
呼び出された --session.getId()
= 初期セッション ID10:06
heartbeat.jsp
呼び出された --session.getId()
= 初期セッション ID10:09
heartbeat.jsp
呼び出された --session.getId()
<> 初期セッション ID
初期セッション IDの最終アクセス時刻は で10:06
あるため、初期セッション ID のタイムアウト時間は であると想定され10:14
ます。しかし、なぜ で10:09
、session.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");