2013-02-28 113 views
1

我有一個請求,會議網頁很簡單的問題。當我使用不同標籤的相同瀏覽器或通過新窗口多次請求同一頁面頁面時,會話ID和會話創建時間相同。請求和會議的Servlet

這我已經從Internet Explorer完成。但是,當使用不同的瀏覽器,如谷歌瀏覽器,並訪問相同的頁面,然後不同的會話ID和會話創建時間在那裏。據我所知,http請求是無狀態的。

所以,在我的情況下,它似乎並沒有被同一個瀏覽器針對不同的HTTP請求新線程的無國籍是由容器創建新的servlet創建。所以,我得出以下結論:

如果需求是來自同一個瀏覽器發送不同的標籤頁中打開通過當時另一個新的窗口,要求始終使用與相同的會話ID的servlet運行在同一個線程。如果請求是從不同的瀏覽器發送的,那麼新的http請求會使用新的會話ID發送。那麼,我的問題是什麼時候它是無狀態的?如果請求是從不同的瀏覽器併發發送的?如果我在春季宣佈scope="request">scope="session">那麼它也遵循相同的情況?如果我的理解錯了,請糾正我。

回答

1

當您的服務器應用程序啓動一個新會話時,servlet容器會發送一個Set-Cookie標題,並將JSESSIONID返回給瀏覽器。瀏覽器會保存該cookie,並將其每次發送回服務器,而不管您提出請求的標籤是什麼。 Obvoiusly其他瀏覽器無法訪問該cookie,因此它們將從服務器接收另一個。

當你的服務器收到一個JSESSIONID cookie的請求時,它可以關聯與早些時候提出的同一個ID請求該請求。 serlvet容器能夠將不同的屬性與該id相關聯,並在請求之間保留這些屬性。 http會話對象基本上是這些屬性的容器,您的服務器應用程序具有讀/寫訪問權限。基本上,這是在另外的無狀態http協議之上用http會話實現statefull的方式。

對於線程:每個請求可以通過任何隨機線程處理,因爲會話數據未綁定到特定線程。它是維護從會話ID到包含不同屬性的會話對象的映射的servlet容器。因此任何隨機線程都可以根據其會話ID訪問屬於當前請求的會話對象。

在Spring中,request作用域意味着爲每個請求新創建一個bean實例,而session作用域bean的生命週期綁定到http會話的生命週期。

1

scope="request" 

創建每個請求的bean的新實例。

scope="session" 

創建bean的新實例每session.And保持bean實例,整個會話生命週期不管瀏覽器的

Refer this for better understanding

1

,HTTP協議是無狀態的。通過cookie和會話實現狀態充滿。

當瀏覽器發送請求時,服務器創建會話並向客戶端發回一個唯一的ID。客戶端在隨後的請求中使用此ID(Cookie),以便服務器可以識別請求並將其與會話相關聯。

就請求而言,服務器創建單獨的線程來處理每個請求,而不管窗口,標籤或瀏覽器如何。但是,每個瀏覽器只能創建一個會話。

注意:最新的瀏覽器共享會話和從選項卡或新窗口所做的請求將使用相同的會話。 IE最新發布的IE7,IE8和IE9都是鬆散耦合IE(LCIE)。檢查這個更多的細節LCIE