2013-02-15 69 views
1

關於HTTP會話:它通過cookie或URL重寫來實現。tcp上的HTTP會話持久性斷開連接

由於HTTP 1.1使用持久連接,我假定當TCP連接斷開時會話失效。或不?
我對此感到困惑,因爲否則使用cookie與URL重寫的行爲將不會相同,對嗎?我的意思是瀏覽器不會將URL的重寫值部分存儲到磁盤,對嗎?

此外,如果它不是,當tcp連接重置時,我們如何在程序上使它在服務器上無效? Tomcat中的監聽器?

回答

4

由於HTTP 1.1使用持久連接,我假定一個會話無效TCP連接斷開時。或不?

這是錯誤的。

在Java中,會話通過cookie實現,通常是(tomcat,jetty等)。一個名爲JSESSIONID = 1234567(該數字是隨機生成的並標識會話)的cookie在第一個響應中從服務器設置,然後它被存儲在瀏覽器中,並在每次後續連接時發送回服務器。 這個cookie通常具有30分鐘的默認生存時間,並在tcp連接中斷時存活。這允許服務器通過不同的連接識別用戶。

URL重寫意味着每個URL包含作爲URL一部分的JSESSIONID,在服務器端沒有任何變化,除了JSESSIONID值是從URL而不是從cookie中讀取的。

如果在tcp連接關閉後cookie丟失,則完全沒用。設想一個基於持久tcp連接的聊天系統:如果您只需標識綁定到套接字的標識符的連接,您是否需要cookie?不... Cookie的確很有用,因爲您需要通過多個連接跟蹤用戶。

由於HTTP 1.1使用持久連接,

他們是持久的,在含義的第一請求(HTML頁面)後,相同的連接可以重複使用也發送其他資源(圖像,CSS,JavaScript等)。並且瀏覽器在一段時間後保持連接打開,以避免用戶點擊另一個鏈接時重新建立新的連接。這只是一種優化,並不意味着當你在瀏覽器中打開一個URL時,這個連接會一直保持在同一網站上。

此外,如果它不是,我們如何在程序上使服務器上的tcp連接重置時使其無效? Tomcat中的監聽器?

在服務器上,您始終可以使呼叫session.invalidate()的會話無效。 如果您想在每次發出請求時使會話無效,那麼您根本不需要會話。

Cookie也可以通過javascript在客戶端無效。

我對這個很困惑,因爲以其它方式使用餅乾VS URL重寫不會是行爲一樣,對嗎?我的意思是瀏覽器不會保存URL重寫到磁盤的值的部分,是否正確?

URL重寫,Cookie是禁用的作品。基本上,每一次你點擊一個鏈接,該JSESSIONID時間=被附加到URL,那麼服務器會識別用戶,並且所有的後續環節將繼續具有相同JSESSIONID在服務器上生成。這樣,每個POST或GET請求都將包含用戶(會話)的標識。

這個cookie的工作方式是一樣的,只不過它不是在URL上進行硬編碼,而是作爲頭信息嵌入在HTTP請求中,並由瀏覽器自動完成(除非它已被禁用)。

這並不意味着它被保存在磁盤(目的是什麼?),它只是保持它在內存中,會話cookie(當你關閉瀏覽器或30分鐘後到期)。

您可以設置更長的續航時間爲一個cookie;在這種情況下,瀏覽器會將Cookie存儲更長時間。但通常這些不是「會話cookie」,而是用於識別特定用戶的cookie(如UUID)。從UUID cookie中,您可以在同一用戶重新連接時創建新的會話Cookie。

會話用於跟蹤CONVERSATION。用戶關閉瀏覽器,對話結束。如果存在像UUID這樣的持久cookie,那麼您可以使用該cookie來創建新對話,並將新會話綁定到之前遇到的同一用戶。

+0

1)如此做瀏覽器存儲'JSESSIONID'作爲URL重寫到磁盤的一部分? 2)'session.invalidate()'從服務器的內存映射中刪除'JSESSIONID'因此服務器重啓會導致基本上所有的會話都失效? – Cratylus 2013-02-15 20:31:58

+0

URL重寫JSESSIONID存儲在保存在瀏覽器內的頁面的HTML內部。在每個鏈接中,您都有在URL上編碼的JSESSIONID。它不一定存儲在磁盤中,它存儲在內存或磁盤中,具體取決於您的瀏覽器如何存儲從互聯網下載的所有內容。但它實際上並不需要存儲在磁盤上。它是鏈接上的商店。 – 2013-02-15 20:37:01

+0

2)session.invalidate()從服務器的內存映射中刪除JSESSIONID? <<是的。也可能會將「刪除cookie」指令發送回瀏覽器。 – 2013-02-15 20:38:01