Servlets 如何让用户知道其会话已过期?

Servlets 如何让用户知道其会话已过期?,servlets,tomcat6,Servlets,Tomcat6,我已将Tomcat设置为在15分钟不活动后处理会话。像这样的 <session-config> <session-timeout>15</session-timeout> </session-config> 15 每当用户访问受限页面(需要用户登录的页面)时,我都会检查会话以查看登录过程是否已完成。如果有,则授予访问权限;如果没有,则将用户重定向到登录页面,在该页面上提示用户输入有效ID和密码。如果会话超时,则要求用户再次登录。这很好

我已将Tomcat设置为在15分钟不活动后处理会话。像这样的

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

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


我该怎么做呢?我找到了HttpSessionListener接口,并认为它可能会有所帮助,但sessionDestroyed方法在会话失效之前就被调用了,因此设置一个参数没有任何好处,正如预期的那样。

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

登录时,设置一个长寿cookie(1天?),在正常注销时删除它(将年龄设置为0)。如果在用户未登录且cookie仍然存在时再次登录到登录页面,则表示会话已过期

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

您已注销,因为会话已过期。

您可以通过以下方式检查会话是否已过期和/或超时:

if (request.getRequestedSessionId() != null
        && !request.isRequestedSessionIdValid()) {
    // Session is expired
}
使用
getRequestedSessionId
区分新会话和现有(有效/过期)会话,使用
isRequestedSessionIdValid
区分有效会话和新会话/过期会话


您可以将此代码放入一个。

当会话过期时,实际上很难设置该参数/cookie。你将如何决定何时这样做?会话过期期间,无法执行
HttpServletRequest
。后续的新请求/会话不知道前一个请求/会话。当用户登录时,在用户浏览器中放置cookie,并在HttpSession中放置令牌。如果cookie存在而会话或令牌不存在,则表示该用户最近登录并且其会话超时。是。。正如我回答的那样。但是,当您将用户重定向到登录表单时,您确实是这么说的。你会怎么做?@BalusC:我明白你现在的意思了。我最初的回答是如何将信息传递给登录表单,告诉它需要显示一些不同的消息。这是一个很好的发现。顺便说一下,你也可以在EL中这样做。请求可以通过
${pageContext.request}
访问。谢谢,这是一种非常好的方法