2011-05-24 169 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}。