【发布时间】: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>
但它不起作用。
【问题讨论】:
如何在错误页面中检查会话是否超时?
我试过了
<c:choose>
<c:when test="${empty pageContext.request.session}">
//do smth
</c:when>
<c:otherwise>
//do smth
</c:otherwise>
</c:choose>
但它不起作用。
【问题讨论】:
确实没有可靠的方法来检测它。您可以在所有链接/表单中摆弄一些基于会话的令牌作为请求参数,并在过滤器中对其进行验证,但这完全是欺骗性的,而且对 SEO 并不友好。
您可以做的最好的事情是在主模板的<head> 中添加一个<meta http-equiv="refresh"> 标记,以便在会话过期时将页面重定向到会话超时错误页面自动。由于您使用的是共享错误页面,您可以将条件作为请求参数传递:
<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。
【讨论】:
我认为这不会像你想要的那样工作。试试 ${pageContext.request.session.new}
如果您没有在 标记中指定,我认为它不会创建新会话,因此您的第一个代码 /might/ 可以工作,但我会强调以我的方式检查如上所示。
.isNew() 是在 HttpSession 上定义的
【讨论】:
request.getSession() 将始终返回会话,因此您的方法将不起作用。如果您的要求不是创建会话,当不存在时,使用自定义标签。
如果您想在会话不存在时创建会话,并且您想知道请求是否正在加入会话/创建新会话。使用 ${pageContext.request.session.new}。
【讨论】: