最近做ICEFACES的项目 AJAX的, 要写一个session即将过期的提醒, 普通的项目直接一个js定时器就搞定了, 因为任何和服务器的响应都回刷新session的过期时间(重新计时),但是AJAX是部分刷新的, 你点个按钮 , session已经重新计算了,可是你的js定时器还在计时,这个就出问题了。
开始GOOGLE找了个帖子:http://www.iteye.com/topic/974771?page=3#1998066
这个帖子讨论了很多方法,我也各种过滤器, 各种后端调用前段JS, 各种失败, java那后端调用前段的类库居然不支持setTimeout()。
后来发现ICEFACES是自己有api的
The JavaScript API Reference shows the api and example.
http://www.icefaces.org/docs/latest/htmlguide/devguide/references4.html
ICEfaces javascript api :
Ice.onSendReceive(id, sendCallback, receiveCallback)
Ice.onAsynchronousReceive(id, callback)
Ice.onServerError(id, callback)
Ice.onSessionExpired(id, callback)
Etc…
I use the javascript api in ICEfaces:
Ice.onSendReceive(id, sendCallback, receiveCallback)
这样就非常方便了, 每次请求和响应都能拦截到,直接重置计时器即可。对AJAX了解还不深处与菜鸟阶段。找寻问题思路太死,还是经验和视野的问题。
附上代码吧:
//------------------------------------------------------------------------
// Function to warn user session is about to expire
//------------------------------------------------------------------------
function InitSessionTimer() {
warn_sec = 55 * 60 * 1000; //Warning time in milliseconds
timeout_sec = 60 * 60 * 1000; //Actual timeout in milliseconds
show_warning = true;
epoch = new Date().getTime();
CheckSessionStatus();
}
window.onload = function(){
InitSessionTimer();
//use ICEFaces API Ice.onSendReceive()
Ice.onSendReceive('document:Body',
function(){},
function(){InitSessionTimer();}
);
};
function CheckSessionStatus() {
//Check for session warning
epoch2 = new Date().getTime();
if (epoch2 > epoch + warn_sec && epoch2 < epoch + timeout_sec && show_warning) {
show_warning = false; //Don't show again
alert_shown = true;
alert("Your session is about to expire. Please save your changes.");
setTimeout("CheckSessionStatus();", 1000 * 60);
} else {
setTimeout("CheckSessionStatus();", 1000 * 60);
}
}