我想在浏览器上打开网页时保持会话活动,即使我长时间没有触摸它,这就是我尝试的方式:
heartbeat.jsp
&还将初始会话id的值传递给它。 heartbeat.jsp
中,我转储session.getId()
的价值&初始会话ID。 [执行结果的时间表]:
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: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 code seg]:
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");
答案 0 :(得分:0)
我通过定时后台jquery ajax调用空白页解决了这个保持会话活动问题 - 服务器在后台每x秒接收一个请求。 Jquery可能更简单吗?