2011-05-24 130 views
2

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

我已经试过

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

,但它不工作。

回答

2

真的没有可靠的方式来检测。您可以在所有链接/表单中将一些基于会话的令牌调整为请求参数,并在过滤器中对其进行验证,但这完全是可欺骗的,并且不是真正的SEO友好。

最好的你可以做的是一个<meta http-equiv="refresh">标记添加到该页面重定向到会话超时错误页自动每当会话过期主模板的<head>。由于您使用的共享的错误页面,你可以通过条件作为一个请求参数:

<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获取所有可用的获得者。

0

我不认为这会按照你想要的方式工作。尝试$ {pageContext.request.session.new}

如果您没有在<%@ page session =“false”%>标记中指定,我认为它不会创建新会话,因此您的第一个代码/可能/工作,但我会强调检查我以上所述的方式。

.isNew()是在HttpSession中定义

+0

它既不会与session =“false”也不会与session.new 实际上我希望用户看到有关会话的消息在一段时间后浏览链接时已超时。但我也使用此页面通知用户他们没有访问一些资源(我从过滤器重定向到此页面)。因此,我使用这种构造来检查会话超时以提供不同的消息 – maks 2011-05-25 00:11:41

0

request.getSession()将始终返回会话,这样你的做法是行不通的。如果您的需求不是创建会话,当不存在时,请使用自定义标签。

如果你想创建一个会话,当它不存在,并且你想知道请求是否加入会话/创建一个新的会话。使用$ {pageContext.request.session.new}。