2010-01-04 70 views
2

我已经设置了Tomcat在闲置15分钟后处理会话。事情是这样的如何让用户知道他/她的会话已过期?

<session-config> 
    <session-timeout>15</session-timeout> 
</session-config> 

每当用户访问受限制的网页(需要先登录的用户)我检查会话,看是否在登录过程已经完成。如果有,则授予访问权限(如果没有),那么用户将被重定向到登录页面,并在其中提示用户输入有效的ID和密码。如果会话超时,则用户需要重新登录。这很好,但我想让用户知道他/她必须再次登录,因为会话已超时。

我该如何去做这件事?我发现HttpSessionListener接口,并认为它可能会有所帮助,但sessionDestroyed方法在会话失效之前被调用,因此设置参数没有什么好处,如预期的那样。

回答

2

登录时,请设置一个长期存活的Cookie(1天?),在正常注销期间删除(将年龄设置为0)。如果您在用户未登录且cookie仍然存在的情况下再次登录登录页面,则表示该会话已过期。

<c:if test="${empty user && not empty cookie.user}"> 
    You were logged out because the session was expired. 
</c:if> 
2

当您将用户重定向到登录表单时,请设置一个请求参数,url参数或指示会话已过期的cookie(如果您使用cookie,则在显示登录表单后清除cookie)。然后,在显示表单时,检查会话过期指示符并显示相应的消息。

+0

当会话过期时,实际上只设置**参数/ cookie是很困难的。你会如何确定*何时做到这一点?在会话过期期间,没有办法使用“HttpServletRequest”。随后的新请求/会话不知道前一个请求/会话。 – BalusC 2010-01-05 11:53:49

+0

用户登录时在用户的浏览器中添加一个cookie,并在HttpSession中添加一个标记。如果cookie存在且会话或令牌不存在,则用户最近登录并且他们的会话超时。 – 2010-01-05 16:24:08

+0

是的,正如我回答的那样。但是,您直接说*当您将用户重定向到登录表单*。你会怎么做? – BalusC 2010-01-05 21:20:33

2

您可以检查会话已过期和/或超时:

if (request.getRequestedSessionId() != null 
     && !request.isRequestedSessionIdValid()) { 
    // Session is expired 
} 

使用getRequestedSessionId到新的和现有的(有效/过期)会话进行区分,并使用isRequestedSessionIdValid区分betwheen有效的和新的/过期的会话。

您可以将此代码置于Filter

+1

这是一个很好的发现。顺便说一句,你也可以在EL中做这个。该请求可以通过'$ {pageContext.request}'访问。 – BalusC 2010-06-29 12:12:11

+0

谢谢,这是一个非常好的方法 – pgmura 2010-06-29 15:40:42

相关问题