2017-07-31 90 views
1

我試圖從HttpSessionListener中捕獲sessionDestroyed事件以檢查是否由sessionTimeout觸發。從HttpSession對象獲取到期

在我調試時,我可以看到一個名爲「expiring」的屬性,根據文檔此屬性用於在內部跳過一些異常。

即將到期 我們目前正在處理會話過期,因此繞過某些IllegalStateException測試。 Source

的問題是,因爲這個屬性被設置爲「保護」我不能檢查,如果該事件是由有效會話超時觸發。

我需要捕獲此會話超時事件以保存數據庫中的記錄。

有人可以幫助我嗎?

這是我到目前爲止有:

public class AppHttpSessionListener implements HttpSessionListener { 

    @Override 
    public void sessionCreated(HttpSessionEvent se) { 
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent se) { 
     LOG.log(Level.INFO, "DEBUG: SESION DESTRUIDA"); 
    } 
    private static final Logger LOG = Logger.getLogger(AppHttpSessionListener.class.getName()); 

} 

回答

1

也許你可以嘗試估計它?

@Override 
    public void sessionDestroyed(HttpSessionEvent se) { 

    HttpSession httpSession = se.getSession(); 

    long lastAccessedTime = httpSession.getLastAccessedTime(); 
    int maxInactiveTime = httpSession.getMaxInactiveInterval(); 

    if ((System.currentTimeMillis() - lastAccessedTime) >= (maxInactiveTime*1000) { 
     LOG.log(Level.INFO, "DEBUG: SESION DESTRUIDA"); 
    } 
+1

這正是我現在所做的!哈哈謝謝這是一個正確的答案 –

0

在HTTP協議中,並沒有明確的終止信號,當客戶端不再有效。這意味着,可以用來指示客戶端何時不再活動的唯一機制是超時期限。

會話的默認超時時間由servlet容器定義,可以通過HttpSession接口的getMaxInactiveInterval方法獲取。開發人員可以使用HttpSession界面的setMaxInactiveInterval方法更改此超時時間。這些方法使用的超時時間以秒爲單位定義。根據定義,如果會話的超時期限設置爲-1,則會話永遠不會過期。在所有使用該會話的servlet都退出服務方法之前,會話失效纔會生效。一旦會話失效啓動,新的請求就不能看到該會話。

HttpSession接口的getLastAccessedTime方法允許servlet確定上次在當前請求之前訪問會話的時間。當會話的一部分請求首先由servlet容器處理時,會話被認爲是被訪問的。

+0

謝謝!我會upvote你,但我沒有足夠的代表。但是,這給了我足夠的線索來找到解決方案:)。 –