2013-03-13 41 views
58

我想了解Web.xml中會話配置的會話超時的真正目的。web.xml中的Session TimeOut

<!-- Session Configuration --> 
<session-config> 
     <session-timeout>60</session-timeout> 
</session-config> 

現在讓我告訴你我的問題。

我的應用程序正在導入/上傳一個.txt文件,由於有數百萬條記錄需要導入,因此這個文件一般需要1個多小時。 但會話超時1小時後,雖然我的應用程序仍在導入正在進行的.txt文件。 這樣的應用程序不應該超時,因爲應用程序在後臺執行某些任務。

+0

在會話超時標記內增加您的號碼。如果您有任何疑問,請聯繫我。坦克 – 2013-03-13 10:41:30

+7

如果有任何進程正在進行,我認爲會話不會過期。如果應用程序在該段時間內空閒,會話將到期。如果一些後臺進程正在進行,您的閒置人員不會閒置。 – 2013-03-13 10:49:15

+4

我不確定你的應用程序導入是如何工作的。如果應用程序正在等待I/O完成,那麼它肯定是空閒的,並且會超時 – Joe2013 2013-03-13 10:54:25

回答

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

在上面的代碼"60" stands for the minutes.60 minutes.後,會話將過期所以,如果你想要更多的時間。對於描述的示例-1,您的會話永不過期。

+0

問題是即使會話處於活動狀態(執行某些操作),爲什麼會在60分鐘後過期? – 2013-03-13 10:46:44

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

您可以在會話永不過期的情況下使用「-1」。由於您不知道完成該線程需要多少時間。

+2

@PeakGen:請這麼好,不要只是反對。所以它過期了?在什麼時候這樣做? – zb226 2016-08-03 09:12:52

+0

@ zb226:評論前,請務必檢查線程日期:) – 2016-08-03 09:53:34

+2

@PeakGen:我不認爲線程日期是相關的。其他信息將是相關的。 – zb226 2016-08-18 15:59:11

0

如果您不想超時發生了某種目的的更多信息:

<session-config> 
    <session-timeout>0</session-timeout> 
</session-config> 

應導致沒有超時的話 - >無限

+0

問題是,即使會話處於活動狀態(執行某些操作),爲什麼會在60分鐘後過期? – 2013-03-13 10:48:44

38

設置會話超時永不過期是不可取因爲每次他完成時,用戶都可靠地按下注銷按鈕,以防止服務器承受過多負載(取決於用戶和硬件的數量)。另外,您可能遇到的一些安全問題寧願避免。

當服務器仍在處理任務時會話失效的原因是因爲客戶端(用戶瀏覽器)和服務器端之間沒有通過例如通信協議進行通信。一個http請求。因此,服務器無法瞭解用戶狀態,認爲他正在閒置,並在您的web.xml中設置的時間後使會話無效。

爲了解決這個問題,你有幾種可能:

  • 你可以你的後端,而正在運行的任務摸了會議,並防止它被過期
  • 增加<session-timeout>在服務器內部但我不會推薦這個
  • 在一個專用線程中運行你的任務,該線程在工作時觸及(擴展)會話,或者在線程完成時通知用戶

有一個類似的問題提出,也許你可以在你的項目中調整這個解決方案的一部分。看看this

希望這會有所幫助,玩得開心!

+2

請注意,用戶登錄和會話是兩件獨立的事情。一般來說servlet沒有「註銷」。服務器需要一個「註銷」頁面來明確調用_HttpSession_的_invalidate()_方法。 – 2013-11-21 17:14:30

9

通過javascript定期向服務器發送AJAX Http請求(每60秒一次),以維持與服務器的會話,直到文件上傳完成。

-2

通常,請求處理過程中會話不會過期。我認爲有一個LB或其中之間的東西讀取整個文件,然後調用Web容器。

這可能會導致延遲導致會話過期。

+0

當請求正在處理時,會話可能過期。對於例如如果會話超時設置爲15分鐘,並且收到的請求時間爲20分鐘,並且服務器此時未收到任何請求,則會話超時。 – user1707141 2015-10-14 19:45:56

9

哈克的方式:

當大量上傳/下載,預計您可以編程增加會話超時。

session.setMaxInactiveInterval(TWO_HOURS_IN_SECONDS) 

當過程結束時,您可以將超時設置恢復爲其默認值。

但是,當您使用Java EE時,上傳/下載不需要一整小時,更好的方法是通過異步方式運行任務(通過JMS)。

3

您可以用兩種方法對這個問題申報時間..

1)要麼放棄過很長一段時間,你的文件讀取是在這段時間之間完成。

<session-config> 
    <session-timeout> 1000 </session-timeout> 
</session-config> 

2)聲明時間永遠不會過期您的會話。

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

這是一個不錯的提示。非常感謝+1 – 2014-05-20 17:46:21

4

您可以看到許多選項作爲您的問題的答案,但是您可以在會話永不過期的情況下使用「-1」。由於您不知道完成該線程需要多少時間。例如: -

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

或者,如果你不想超時發生了某種目的:

<session-config> 
    <session-timeout>0</session-timeout> 
</session-config> 

另一個選擇可能是增加的數量爲1000,等,等,BLA BLA,喇嘛。

但是,如果你真的想停下來,你認爲你的應用程序強制用戶註銷是不必要的,只需添加一個註銷按鈕,用戶將決定何時離開。

如果您不需要強制註銷,並且您正在加載可能需要時間基於服務器和計算機速度以及文件大小的文件,則可以採取以下措施來解決問題。

<!-- sets the default session timeout to 60 minutes. --> 
    <!-- <session-config> 
    <session-timeout>60</session-timeout> 
    </session-config> --> 

只是評論或刪除就是它! Tan tararantan,曬黑!

+4

0和-1之間有什麼區別? – efirat 2016-02-10 19:57:37

1

我建議的另一個選擇是創建一個獨立的應用程序,它將採用大文件的無狀態。在您的主應用程序中打開一個新窗口或iframe,它將接受該文件並通過該窗口發送,然後在使用Javascript開始上傳時隱藏窗口或iframe。

5

的文檔說:

會話超時元素定義在此Web應用程序創建的所有會話的默認會話超時間隔。指定的超時時間必須以整數分鐘表示。如果超時時間爲0或更短,容器將確保會話的默認行爲永遠不會超時。如果未指定此元素,則容器必須設置其默認超時期限。

0

你應該考慮拆分大文件塊,並依靠多線程處理能力,在一次處理多個文件 OR 讓使用TimerTask的運行作爲後臺任務的全過程,並另寫查詢就知道如果可以知道文件或記錄的處理時間,則可以顯示包含進度條的瀏覽器的狀態。