通过调用jsp命令发送heartbeart';我不能让会话保持活动状态
当我在浏览器上打开网页时,即使我长时间不触摸它,我也希望保持会话的活动状态,这就是我试图做到的:通过调用jsp命令发送heartbeart';我不能让会话保持活动状态,jsp,session,keep-alive,heartbeat,Jsp,Session,Keep Alive,Heartbeat,当我在浏览器上打开网页时,即使我长时间不触摸它,我也希望保持会话的活动状态,这就是我试图做到的: 在服务器端(tomcat),会话超时设置为8分钟 主jsp生成一个html。在这个html中,我使用定时器和ajax每3分钟调用一次heartbeat.jsp,并将初始会话id的值传递给它 在heartbeat.jsp中,我转储session.getId()的值和初始会话id [执行结果时间表]: 10:00I打开页面——主jsp程序生成客户端html 10:03heartbeat.jsp调用--
heartbeat.jsp
,并将初始会话id的值传递给它李>
heartbeat.jsp
中,我转储session.getId()
的值和初始会话id
I打开页面——主jsp程序生成客户端html10:00
10:03
调用--heartbeat.jsp
=初始会话idsession.getId()
10:06
调用--heartbeat.jsp
=初始会话idsession.getId()
10:09
调用--heartbeat.jsp
初始会话idsession.getId()
10:06
,因此初始会话id的超时时间应为10:14
。但是为什么在10:09
,session.getId()
获取另一个新id
前两次调用似乎没有在服务器端重置初始会话的超时计数器。我在IE和Firefox中测试了这一点,它们的结果相同
我怎样才能使会话永远保持有效
[主jsp代码seg]:
<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>
我通过对空白页面的定时后台jquery ajax调用解决了这个保持会话活动的问题——服务器在后台每隔x秒接收一次请求。Jquery可能更简单?您不需要在请求中发送sessionid吗?很抱歉,从jsp开始已经太久了,但我认为有一个sessionid参数,您可以发布实际的客户端HTML和jsp代码吗?显然,只有相关部分@亚历克斯:我尝试
heartbeat.jsp;jsessionid=…
但问题仍然存在。我确信浏览器中启用了cookie,所以通常(至少对于firefox而言)web servr应该将set cookie发送到浏览器&我不需要显式发送会话id,对吗@保罗:我添加了代码段。
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");