2009-12-22 37 views
2

我是JSP新手。我用下面的代碼中實現HttpSessionListener得到SESSION OUT當會話超時類:如何調用會話時會話超時

public void sessionCreated(HttpSessionEvent arg0) { 
     System.out.print("SESSION Created"); 
    } 

    public void sessionDestroyed(HttpSessionEvent arg0) { 
     System.out.print("SESSION OUT"); 
    } 

,我在web.xml設置:

<session-config> 
    <session-timeout>1</session-timeout> 
    </session-config> 

該servlet等待時間超過兩分鐘,然後它叫sessionDestroyed

超時時是否有辦法強制sessionDestroyed

在此先感謝。

回答

2

是什麼讓你認爲sessionDestroyed而不是會話超時時被調用?或者換句話說,你怎麼解釋它被調用的事實?

servlet將以自己的方式處理會話的有效性,包括會話超時,以及何時確定會話不再有效,它會調用您的方法。然而,我認爲任何servlet都不能保證在這方面有任何特殊的及時性。我的理解是,它有點像垃圾回收,因爲它確保在某個點處發生,但不一定在會話有資格銷燬的最早可能情況下。

在任何情況下,似乎幾乎可以肯定的是,servlet正在做你想做的事 - 看到會話超時並調用適當的方法 - 唯一的問題是你是否準確地在60秒後看到這個最後的請求或稍後。我建議,一般來說,不應該依賴於調用此方法的確切時間。使用它來清理資源,當然,但不是像程序正確性那樣(如果在無效會話上調用方法,則會得到IllegalStateExceptions)。如果你覺得你真的必須依靠這個,或許可以解釋你在做什麼,以便其他人可以建議更合適的方法來實現這一點。

1

我不認爲J2EE規範會對何時調用監聽器上的方法做出任何保證。它只是表明他們會在某個時候被召喚。

我見過的代碼在一個容器(Tomcat)上工作,但沒有在另一個容器(OC4J)上工作。開發人員對於何時調用sessionDestroyed方法做出了無效的假設。

UPDATE

注意,在Servlet規範的V2.4改變了這種接口的行爲。有關詳細信息,請參見page 21

1

當您強制用戶通過invalidate()方法註銷HttpSessionListener的sessionDestroyed()方法時,會調用兩次,一次它們註銷時,第二次在一段延遲的時間段後。如果在註銷後將用戶重定向到應用程序內的網頁,就會發生這種情況。你實質上正在做的是開始另一個會話(如果你沒有將安全/認證要求添加到你的所有網頁中,這可能並不明顯),並且sessionDestroyed()方法的延遲第二次調用是超時發生。簡單的解決方案在註銷時將用戶重定向到應用程序之外的網頁。閱讀本文session

1

該servlet等待超過兩分鐘,然後它調用sessionDestroyed。

有沒有辦法強制sessionDestroyed超時?

這是實現特定的(取決於應用程序服務器)。有一個後臺線程可以定時檢查會話並收回所有過期的會話。這可能會每分鐘發生一次,但也可能是每15分鐘一次。如果您在相關會話已超時但尚未收回的情況下發出請求,它們也將立即獲得。

因此,如果您例如等待一分鐘併發起新的請求,那麼它將立即收割。真的沒有必要擔心這一點。你不需要強迫它立即收割,這將是一項昂貴的任務。你知道,這只是關於編程,而不是關於一些魔法;)

+0

我不知道這個接口還有什麼設計目的,除了釋放特定會話在被銷燬時佔用的資源。我想說的是,爲了這個設計目的,沒有必要在某個確切點(例如'超時')發生。這只是我的觀點。我不知道這是否正確。謝謝。 – 2015-06-15 13:30:52