会话过期后自动注销
我们的应用程序在30分钟后注销并重定向到登录页面,我在web.xml中指定会话超时并使用requestProcessor进行重定向。我想向用户显示一条消息,一旦会话过期,你的会话过期了,我该怎么做。自动注销? 我想在页面上提示错误信息“会话超时,请重新登录”。那我怎么能检测到会话超时?任何方法会自动触发吗?会话过期后自动注销
创建一个活动检查器,该活动检查器每分钟检查是否发生任何用户活动(mouseclick,keypress),并向服务器端执行检测信号,以便在用户处于活动状态时保持会话活动状态,而当用户不活动时不执行任何操作活性。当30分钟内没有活动(或者在服务器端设置了默认的会话超时时间)时,请执行重定向。
下面是一个启动示例,几乎没有jQuery的帮助来绑定点击和按键事件并激发ajax请求。
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
$(document).ready(function() {
$.active = false;
$('body').bind('click keypress', function() { $.active = true; });
checkActivity(1800000, 60000, 0); // timeout = 30 minutes, interval = 1 minute.
});
function checkActivity(timeout, interval, elapsed) {
if ($.active) {
elapsed = 0;
$.active = false;
$.get('heartbeat');
}
if (elapsed < timeout) {
elapsed += interval;
setTimeout(function() {
checkActivity(timeout, interval, elapsed);
}, interval);
} else {
window.location = 'http://example.com/expired'; // Redirect to "session expired" page.
}
}
</script>
创建Servlet
它侦听/heartbeat
和做基本上只是执行以下操作:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
request.getSession();
}
保持会话活着。
当您将登录用户存储在会话中时,只要会话过期,它将“自动”注销。所以你不需要手动注销用户。
如果您使用的是servlet会话,则可以使用isNew()方法检查jsp/servlet正在返回的会话是否是新会话。如果是,则用户的会话已过期,您可以显示相关消息。
用户会话过期消息必须在超时后显示,在您的情况下,它将显示即使注销后,我不需要 – sarah 2010-07-08 09:09:23
创建监听类实现HttpSessionListener
,并在web.xml
定义它时,任何会话被销毁这会通知您。使用sessionDestroyed()
方法。
见一个完整的例子在这里:
http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/
上述解决方案不会强制浏览器显示对话框。 – 2010-07-08 09:57:44
上述解决方案将强制应用程序提示即使注销后的消息,它也不会检查到期时间,比如说30分钟,并显示消息 – sarah 2010-07-08 11:28:02
包括你的JSP中一个JavaScript实用功能和ping服务器每31分钟。 上面提到的实用函数应该在内部使用setTimeout()JS函数。
setTimeout ("checkServerSession()", /* intervalInMilliSeconds */ 31000);
注意
checkServerSession()
是一个普通的JS功能,可能会触发HTTP请求。如果请求成功,则会话存在,否则向用户显示提示。
让我知道一个例子,该如何起作用 – sarah 2010-07-08 11:29:26
我希望显示警报消息30分钟后,如何更改上述脚本,我已在web.xml中定义会话超时 – sarah 2010-07-09 09:21:25
即使应用程序正在使用,此脚本也会弹出。 – sarah 2010-07-10 05:07:37
当您在同一个会话中打开多个窗口时,确实会发生这种情况。这是一个基本的开球的例子。你需要更进一步。只要用户处于活动状态,向服务器端发送ajaxical轮询以保持会话活动。你可以在[我的其他答案]中找到一个例子(http://stackoverflow.com/questions/2319020/mvc-with-jquery-handling-session-expire/2319211#2319211)。 – BalusC 2010-07-10 05:16:16