【问题标题】:How can I check whether session was timed out?如何检查会话是否超时?
【发布时间】:2011-09-01 08:30:15
【问题描述】:

如何在错误页面中检查会话是否超时?

我试过了

<c:choose>
    <c:when test="${empty pageContext.request.session}">
        //do smth
    </c:when>
    <c:otherwise>
        //do smth
    </c:otherwise>
</c:choose>

但它不起作用。

【问题讨论】:

    标签: jsp jstl el


    【解决方案1】:

    确实没有可靠的方法来检测它。您可以在所有链接/表单中摆弄一些基于会话的令牌作为请求参数,并在过滤器中对其进行验证,但这完全是欺骗性的,而且对 SEO 并不友好。

    您可以做的最好的事情是在主模板的&lt;head&gt; 中添加一个&lt;meta http-equiv="refresh"&gt; 标记,以便在会话过期时将页面重定向到会话超时错误页面自动。由于您使用的是共享错误页面,您可以将条件作为请求参数传递:

    <meta http-equiv="refresh" content="${pageContext.session.maxInactiveInterval};url=error.jsp?type=timeout" />
    

    并在error.jsp中检查如下:

    <c:choose>
        <c:when test="${param.type == 'timeout'}">
            <p>Your session has been timed out.</p>
        </c:when>
        <c:otherwise>
            <!-- Handle default case here. -->
        </c:otherwise>
    </c:choose>
    

    哦,是的,${pageContext.session} 是合法有效的。 ${pageContext.request.session} 只是一个不必要的绕道。检查 PageContext javadoc 以获取所有可用的 getter。

    【讨论】:

      【解决方案2】:

      我认为这不会像你想要的那样工作。试试 ${pageContext.request.session.new}

      如果您没有在 标记中指定,我认为它不会创建新会话,因此您的第一个代码 /might/ 可以工作,但我会强调以我的方式检查如上所示。

      .isNew() 是在 HttpSession 上定义的

      【讨论】:

      • 它不适用于 session="false" 和 session.new 实际上我希望用户在一段时间后浏览链接时看到有关会话已超时的消息。但我也使用此页面通知用户他们无权访问某些资源(我从过滤器重定向到此页面)。所以我使用这样的构造来检查会话超时以给出不同的消息
      【解决方案3】:

      request.getSession() 将始终返回会话,因此您的方法将不起作用。如果您的要求不是创建会话,当不存在时,使用自定义标签。

      如果您想在会话不存在时创建会话,并且您想知道请求是否正在加入会话/创建新会话。使用 ${pageContext.request.session.new}。

      【讨论】:

        猜你喜欢
        • 2011-03-26
        • 2011-09-04
        • 1970-01-01
        • 2011-02-18
        • 2010-10-12
        • 1970-01-01
        • 2012-10-18
        • 2010-11-23
        相关资源
        最近更新 更多