会话过期后自动注销

问题描述:

我们的应用程序在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(); 
} 

保持会话活着。

当您将登录用户存储在会话中时,只要会话过期,它将“自动”注销。所以你不需要手动注销用户。

+0

我希望显示警报消息30分钟后,如何更改上述脚本,我已在web.xml中定义会话超时 – sarah 2010-07-09 09:21:25

+0

即使应用程序正在使用,此脚本也会弹出。 – sarah 2010-07-10 05:07:37

+0

当您在同一个会话中打开多个窗口时,确实会发生这种情况。这是一个基本的开球的例子。你需要更进一步。只要用户处于活动状态,向服务器端发送ajaxical轮询以保持会话活动。你可以在[我的其他答案]中找到一个例子(http://stackoverflow.com/questions/2319020/mvc-with-jquery-handling-session-expire/2319211#2319211)。 – BalusC 2010-07-10 05:16:16

如果您使用的是servlet会话,则可以使用isNew()方法检查jsp/servlet正在返回的会话是否是新会话。如果是,则用户的会话已过期,您可以显示相关消息。

+0

用户会话过期消息必须在超时后显示,在您的情况下,它将显示即使注销后,我不需要 – sarah 2010-07-08 09:09:23

创建监听类实现HttpSessionListener,并在web.xml

定义它时,任何会话被销毁这会通知您。使用sessionDestroyed()方法。

见一个完整的例子在这里:

http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/

+1

上述解决方案不会强制浏览器显示对话框。 – 2010-07-08 09:57:44

+0

上述解决方案将强制应用程序提示即使注销后的消息,它也不会检查到期时间,比如说30分钟,并显示消息 – sarah 2010-07-08 11:28:02

包括你的JSP中一个JavaScript实用功能和ping服务器每31分钟。 上面提到的实用函数应该在内部使用setTimeout()JS函数。

setTimeout ("checkServerSession()", /* intervalInMilliSeconds */ 31000); 

注意

checkServerSession()

是一个普通的JS功能,可能会触发HTTP请求。如果请求成功,则会话存在,否则向用户显示提示。

+0

让我知道一个例子,该如何起作用 – sarah 2010-07-08 11:29:26