HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

Tomcat 4.1.30でセッションが切れる

いまさらTomcat 4.x !? という話は置いといて‥
# だって使われてるんだもん‥orz
Tomcat 4.1.30でアプリを動かしていると、セッションタイムアウト時間に達していないはずなのにセッションが切れる、という現象を確認。
そのアプリ、セッションが切れる10秒前にpingのためのリクエストを送るようになっているのだが、いつの間にかセッションが切れている。

Tomcat 4.1.31では発生しないのでどうせバグなんだろうけど、バージョンアップせずに回避できるかどうかが今は重要なので、以下のようなJSPを作って検証してみた。

<%@ page contentType="text/html; charset=UTF-8" %>

<%
int max = session.getMaxInactiveInterval();
int interval = max * 3 / 4;
%>
<%
String s = new java.util.Date() + ":" + "SESSION[" + interval + "/" + max + "](" + (session.isNew() ? "N" : " ") + ")=" + session.getId();
System.out.println(s);
%>
<html>
<head>
<meta http-equiv="refresh" content="<%=interval %>;URL=ping.jsp" />
<title>ping</title>
</head>
<body>
<%=s%>
</body>
</html>

上記は、セッションタイムアウト時間の75%に達したらリフレッシュするというもの。intervalの値をいろいろ変えてみると、以下のような感じだった。

  • 10秒前:×
  • 75%時点:×
  • 50%時点+10秒:×
  • 50%時点:○
  • 50%時点-10秒:○

HttpSessionListenerを作ったりしてさらに調べてみると、タイムアウト時間の半分を過ぎてからアクセスした場合はsession.getLastAccessedTime()の時刻が更新されていないっぽい。
とりあえず、セッションタイムアウト時間の4分の1くらいの時間ごとにpingすれば確実だろうか、といったところか‥