session:
sessionid是一個會話的key,瀏覽器第一次訪問服務器會在服務器端生成一個session,有一個sessionid和它對應。
存儲在服務器的內存中,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,從而再次使用之。
創建:session在訪問tomcat服務器HttpServletRequest的getSession(true)的時候創建,tomcat的ManagerBase類提供創建sessionid的方法:隨機數+時間+jvmid
刪除:超時;程序調用HttpSession.invalidate();程序關閉;
session存放在哪里:服務器端的內存中。不過session可以通過特殊的方式做持久化管理(memcache,redis)。
session的id是從哪里來的,sessionID是如何使用的:當客戶端第一次請求session對象時候,服務器會為客戶端創建一個session,並將通過特殊算法算出一個session的ID,用來標識該session對象
如果你把Cookies看成為http協議的一個擴展的話,理解起來就容易的多了,其實本質上cookies就是http的一個擴展。有兩個http頭部是專門負責設置以及發送cookie的,它們分別是Set-Cookie以及Cookie。當服務器返回給客戶端一個http響應信息時,其中如果包含Set-Cookie這個頭部時,意思就是指示客戶端建立一個cookie,並且在后續的http請求中自動發送這個cookie到服務器端,直到這個cookie過期。如果cookie的生存時間是整個會話期間的話,那么瀏覽器會將cookie保存在內存中,瀏覽器關閉時就會自動清除這個cookie。另外一種情況就是保存在客戶端的硬盤中,瀏覽器關閉的話,該cookie也不會被清除,下次打開瀏覽器訪問對應網站時,這個cookie就會自動再次發送到服務器端。一個cookie的設置以及發送過程分為以下四步:
客戶端發送一個http請求到服務器端 服務器端發送一個http響應到客戶端,其中包含Set-Cookie頭部 客戶端發送一個http請求到服務器端,其中包含Cookie頭部 服務器端發送一個http響應到客戶端
這個通訊過程也可以用以下下示意圖來描述:
在客戶端的第二次請求中包含的Cookie頭部中,提供給了服務器端可以用來唯一標識客戶端身份的信息。這時,服務器端也就可以判斷客戶端是否啟用了cookies。盡管,用戶可能在和應用程序交互的過程中突然禁用cookies的使用,但是,這個情況基本是不太可能發生的,所以可以不加以考慮,這在實踐中也被證明是對的。