【问题标题】:How do I let a user know that his/her session has expired?如何让用户知道他/她的会话已过期?
【发布时间】:2010-01-04 21:17:36
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: servlets tomcat6


    【解决方案1】:

    登录时,设置一个长期存在的 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)。然后,在显示表单时,检查会话过期指示器并显示适当的消息。

      【讨论】:

      • 只有在会话过期时才能真正设置该参数/cookie。您将如何确定 何时 这样做?在会话到期期间没有HttpServletRequest 的方法。随后的新请求/会话不知道前一个。
      • 在用户登录时在用户浏览器中放一个cookie,在HttpSession中放一个token。如果 cookie 存在而会话或令牌不存在,则用户最近登录并且他们的会话超时。
      • 是的..正如我回答的那样。但是您从字面上说当您将用户重定向到登录表单时。你会怎么做?
      • @BalusC:我明白你现在的情况了。我最初的回答是关于如何将信息传递给登录表单,告诉它需要显示一些不同的消息。
      【解决方案3】:

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

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

      使用getRequestedSessionId 区分新会话和现有(有效/过期)会话,使用isRequestedSessionIdValid 区分有效会话和新会话/过期会话。

      您可以将此代码放入Filter

      【讨论】:

      • 这是一个不错的发现。顺便说一句,您也可以在 EL 中执行此操作。 ${pageContext.request} 可以访问该请求。
      • 谢谢,这是一个非常好的方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2013-10-03
      • 2016-01-21
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2011-08-30
      相关资源
      最近更新 更多