sessionid是一個會話的key,瀏覽器第一次訪問伺服器會在伺服器端生成一個session,有一個sessionid和它對應。tomcat生成的sessionid叫做jsessionid。
session在訪問tomcat伺服器HttpServletRequest的getSession(true)的時候建立,tomcat的ManagerBase類提供建立sessionid的方法:隨機數+時間+jvmid;
儲存在伺服器的記憶體中,tomcat的StandardManager類將session儲存在記憶體中,也可以持久化到file,資料庫,memcache,redis等。客戶端只儲存sessionid到cookie中,而不會儲存session,session銷燬只能通過invalidate或超時,關掉瀏覽器並不會關閉session。
那麼Session在何時建立呢?當然還是在伺服器端程式執行的過程中建立的,不同語言實現的應用程式有不同建立Session的方法,而在Java中是通過呼叫HttpServletRequest的getSession方法(使用true作為引數)建立的。在建立了Session的同時,伺服器會為該Session生成唯一的Session id,而這個Session id在隨後的請求中會被用來重新獲得已經建立的Session;在Session被建立之後,就可以呼叫Session相關的方法往Session中增加內容了,而這些內容只會儲存在伺服器中,發到客戶端的只有Session id;當客戶端再次傳送請求的時候,會將這個Session id帶上,伺服器接受到請求之後就會依據Session id找到相應的Session,從而再次使用之。
建立:sessionid第一次產生是在直到某server端程式呼叫 HttpServletRequest.getSession(true)這樣的語句時才被建立。
刪除:超時;程式呼叫HttpSession.invalidate();程式關閉;
session存放在哪裡:伺服器端的記憶體中。不過session可以通過特殊的方式做持久化管理(memcache,redis)。
session的id是從哪裡來的,sessionID是如何使用的:當客戶端第一次請求session物件時候,伺服器會為客戶端建立一個session,並將通過特殊演算法算出一個session的ID,用來標識該session物件
session會因為瀏覽器的關閉而刪除嗎? 不會,session只會通過上面提到的方式去關閉。
下面是tomcat中session的建立: ManagerBase是所有session管理工具類的基類,它是一個抽象類,所有具體實現session管理功能的類都要繼承這個類,該類有一個受保護的方法,該方法就是建立sessionId值的方法: (tomcat的session的id值生成的機制是一個隨機數加時間加上jvm的id值,jvm的id值會根據伺服器的硬體資訊計算得來,因此不同jvm的id值都是唯一的), StandardManager類是tomcat容器裡預設的session管理實現類, 它會將session的資訊儲存到web容器所在伺服器的記憶體裡。 PersistentManagerBase也是繼承ManagerBase類,它是所有持久化儲存session資訊的基類,PersistentManager繼承了PersistentManagerBase,但是這個類只是多了一個靜態變數和一個getName方法,目前看來意義不大,對於持久化儲存session,tomcat還提供了StoreBase的抽象類,它是所有持久化儲存session的基類,另外tomcat還給出了檔案儲存FileStore和資料儲存JDBCStore兩個實現。