问题描述
|
如何在错误页面中检查会话是否超时?
我试过了
<c:choose>
<c:when test=\"${empty pageContext.request.session}\">
//do smth
</c:when>
<c:otherwise>
//do smth
</c:otherwise>
</c:choose>
但它不起作用。
解决方法
确实没有可靠的方法可以检测到这一点。您可以在所有链接/表单中摆弄一些基于会话的令牌作为请求参数,并在过滤器中对其进行验证,但这是完全可欺骗的,并且对SEO并不友好。
最好的办法是在主模板的“ 2”中添加一个“ 1”标签,该标签将在会话过期时自动将页面重定向到会话超时错误页面。由于您使用的是共享错误页面,因此可以将条件作为请求参数传递:
<meta http-equiv=\"refresh\" content=\"${pageContext.session.maxInactiveInterval};url=error.jsp?type=timeout\" />
并在ѭ4中进行检查,如下所示:
<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}
只是不必要的弯路。查看ѭ8javadoc中所有可用的getter。
,我认为这不会按您想要的方式工作。尝试$ {pageContext.request.session.new}
如果您未在<%@ page session = \“ false \”%>标记中指定,我认为它不会创建新的会话,因此您的第一个代码/ might /可以正常工作,但我会强调检查方式我在上面指出了。
.isNew()在HttpSession上定义
,request.getSession()将始终返回会话,因此您的方法将不起作用。如果您的要求不是创建会话,则该会话不存在时,请使用自定义标记。
如果要在不存在的会话中创建会话,并且想知道请求是否正在加入会话/正在创建新会话。使用$ {pageContext.request.session.new}。