Я хочу сохранить сеанс, когда я открываю веб-страницу в браузере, даже если я ее долго не трогаю, вот что я пытаюсь сделать:
- на стороне сервера (tomcat), время ожидания сеанса установлено на 8 минут.
- main JSP генерирует HTML.В этом html я использую timer & ajax для вызова
heartbeat.jsp
каждые 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");