2016-01-30 78 views
6

我不知道如果我的理解:web.xml中session-timeout與max-age之間的區別是什麼?

<session-config> 
    <session-timeout>30</session-timeout> <!-- 30 minutes! --> 
    <cookie-config> 
     <http-only>true</http-only> 
     <max-age>1800</max-age> <!-- 1800 seconds: 30 minutes! --> 
    </cookie-config> 
    <tracking-mode>COOKIE</tracking-mode> 
</session-config> 

此外,有沒有什麼辦法在web.xml配置所有Cookie嗎?這似乎只適用於會話cookie。我需要一個這樣的功能的過濾器嗎?

+1

像max-age這樣的Cookie字段應該由cookie的創建者設置。由於此會話cookie是由容器創建的,容器爲這些字段提供配置。如果您的應用程序生成cookie,則您的應用程序需要設置適當的字段值。 – ZhongYu

回答

13

爲什麼我們甚至需要這個?引用servlet 3規範:

在HTTP協議中,當客戶端不再有效時,沒有明確的終止信號。這意味着 可用於指示客戶端何時不再處於活動狀態的唯一機制是時間段爲 。

的網絡公共模式真的指甲解釋它:

會話超時元素定義在此Web應用程序創建的所有會話的默認會話超時間隔。指定的超時時間必須以整數分鐘表示。

如果超時值爲0或更小,容器將確保會話的默認行爲永遠不會超時。 如果未指定此元素,則容器必須設置其默認的 超時期限。

的網絡公共模式也得到了有關max-age的東西給我們:將分配給該Web應用程序創建的任何會話跟蹤的cookie

壽命(單位:秒)。默認值爲-1

來概括:

  • 會話超時配置會話多長時間縈繞消耗服務器資源,即使沒有被有效訪問。

  • max-age配置客戶端瀏覽器保留會話cookie的時間。此設置僅適用於Cookie的生命週期:如果您使用url重寫,則它不會執行任何操作,並且與服務器端的會話保留時間毫無關係。只要瀏覽器會話處於活動狀態,默認值爲-1就會保留Cookie。

的Servlet 3.1 JSR頁: http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html

的網絡公共XSD,請訪問: http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/web-common_3_0.xsd

的編輯問題問:

此外,有沒有什麼辦法在web.xml中配置所有cookie?這似乎只適用於會話cookie 。我需要一個這樣的功能的過濾器嗎?

我不這麼認爲。 最簡單的™這樣做恕我直言,將javax.servlet.http.HttpServletResponseWrapper覆蓋addCookie()的子類。

+0

因此,如果我的會話cookie的最大年齡小於我的會話超時,則會話可能會繼續存在於web應用程序的內存中,但客戶端不會再發送會話cookie了嗎? –

+0

@KorayTugay你不能直接比較兩個值,他們測量不同的東西(我不只是指不同的單位)。看到我的答案更多:http://stackoverflow.com/a/40825334/274677 –

1

<session-timeout>是未使用會話的最大持續時間(從上次請求開始)。當這段時間沒有使用會話(無請求)時,服務器端應用程序會終止會話(您可以捕獲該事件並實現您自己的行爲)。

會話cookie max-age定義此cookie在用戶瀏覽器中的存儲時間。

爲了統一起見,當會話cookie達到其最大年齡時,會話被強制斷開。在另一種情況下,當會話被session-timemout事件中斷時,會話cookie可能仍然存在於用戶瀏覽器上

1

在解釋他們是什麼之前一定要了解一些事情。從你的問題很明顯,你已經知道的第一,但也許是感到困惑在下面的列表中的第二項:

  • 兩個設置使用不同的單位session-timeout以分鐘爲單位,而max-age以秒爲單位)
  • 它們測量不同的方式時間:session-timeout測量時間以相對方式,max-age測量時間以絕對方式(下面進一步解釋)
  • 他們都考慮在內,並通過不同的軟件組件執行。容器考慮了session-timeout,而max-age則考慮在內並由用戶的瀏覽器強制執行。等效地,您可以說session-timeout適用於服務器端,而max-age適用於客戶端。

session-timeout給出了最大空閒時間之前容器決定銷燬代表與服務器的「連接」會話對象。這意味着您可以將session-timeout的值設置爲1分鐘,並且只要瀏覽器每59秒向服務器發送一次HTTP GET,POST等消息,仍然可以將會話對象永久保留在服務器中。

max-age被用戶的瀏覽器用來計算一個絕對的固定時間點,超過這個時間點,會話cookie(Java中的JSESSIONID)將不再被髮送到服務器。這是一個絕對值,因此,活動或不活動代表用戶沒有任何區別。這就是爲什麼如果您在瀏覽器的開發者控制檯檢查cookies,您看到會話cookie的絕對時間:

enter image description here

買者:對的max-age值以上描述的異常表示一個固定時間點,是否使用特殊解釋值-1。在這種情況下,這就是你在開發者控制檯中看到:

enter image description here

&hellip;也如this answer所述,這意味着瀏覽器將在「瀏覽器會話」期間繼續發送cookie。我將「瀏覽器會話」放在引號中以區別於服務器端會話。瀏覽器如何理解會話的概念(例如,不同的選項卡是否對應於不同的會話)是特定於實現的。

鑑於session-timeoutmax-age不同的語義,它遵循的是企圖「對齊」兩個值,如web.xml摘錄你在你的問題提供:

<session-config> 
    <session-timeout>30</session-timeout> <!-- 30 minutes! --> 
    <cookie-config> 
     <http-only>true</http-only> 
     <max-age>1800</max-age> <!-- 1800 seconds: 30 minutes! --> 
    </cookie-config> 
    <tracking-mode>COOKIE</tracking-mode> 
</session-config> 

&hellip;可能表示混亂。

max-age提供了一個硬限制(除非使用特殊值-1),而session-timeout只要用戶主動使用該會話就不會有效提供限制。

關於(爲session-timeout-1max-age0)的默認和專門解釋價值以及是否可以爲所有的cookies設置這些值(而不是僅僅在會話cookie),這些點在this answer解釋。

相關問題