2014-10-10 141 views
1

我正在開發一個vaadin web應用程序,並且在我的web.xml中添加了下面的代碼片段。會話超時不起作用vaadin

<session-config> 
    <session-timeout>30</session-timeout> 
</session-config> 

現在我注意到也30分鐘後我的用戶能夠使用appllication,我不想這樣。我在vaadin的書上讀到了一些關於這個問題的文章,但我不想解釋一些東西。

從vaadin書:

會話超時後,用戶不活躍

在正常的servlet操作,會話超時定義允許 時間不活動後,服務器應清理的會話。 不活動是從最後一次服務器請求開始測量的。不同的 servlet容器對超時使用不同的默認值,例如Apache Tomcat的30分鐘 分鐘。

在web.xml中:您可以 下設置超時

<session-config> 
    <session-timeout>30</session-timeout> 
    </session-config> 

會話超時應長於心跳間隔或 否則會話關閉心跳,然後才能讓他們活着 。由於會話到期會使UI處於 假定會話仍然存在的狀態,這會在瀏覽器中導致出現錯誤通知 。

但是,如果心跳間隔比會話超時短 (通常情況下)會阻止會話過期。如果servlet的closeIdleSessions參數已啓用(由 默認值禁用),則在session-timeout參數中指定的時間 在最後一次 非心跳請求之後到期之後,Vaadin關閉UI和會話。

在web.xml中:

<servlet> 
... 
<init-param> 
    <param-name>closeIdleSessions</param-name> 
    <param-value>true</param-value> 
</init-param> 

現在我認爲這個問題是我的應用程序服務器離開的用戶界面的狀態下,他們認爲,這次會議仍然存在,但我不能夠理解什麼是心跳?和什麼closeSessionId做得精確?

+0

爲了測試給它1分鐘,並檢查它的工作與否。 – 2014-10-10 08:13:13

回答

2

心跳指示客戶端仍然存在。 例如,當用戶關閉瀏覽器時,客戶端不能再發送心跳, 服務器檢測到並清除服務器端的用戶界面。 默認情況下,這會保持會話永久存在。 因此,如果不是你要設置這在web.xml預期的行爲:

<init-param> 
    <description>Enable Session Timeout</description> 
    <param-name>closeIdleSessions</param-name> 
    <param-value>true</param-value> 
</init-param> 
+0

如果我明白了,如果客戶端關閉瀏覽器,沒有心跳被髮送,然後服務器關閉會話時無法弄清楚。 – Skizzo 2014-10-10 09:17:08

+1

@Skizzo我想如果客戶端關閉瀏覽器,那麼會話將在30分鐘後過期。 但是,如果客戶端保持打開瀏覽器幾個小時,則會話默認保持活動狀態。 如果將closeIdleSessions設置爲true,則即使瀏覽器仍處於打開狀態(當然也沒有用戶活動),會話將在30分鐘後過期。 – Krayo 2014-10-10 09:34:55

+0

我認爲這個話題真的很有趣,如果在Vaadin之書上說「不活躍度是從最後一次服務器請求開始衡量的」,那麼當用戶關閉瀏覽器時,服務器如何檢測會話是不活動的瀏覽器不再發送請求(因爲它已關閉)?服務器是否使用事件循環或事件並觸發事件表明它不再接收來自客戶端的請求? – tonix 2015-02-20 09:48:54