最近做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); } }