Session執行機制與原理
作者:Stanley 羅昊
【轉載請注明出處和署名,謝謝!】
什么是Session
首先了解一下Session的中文意思:一次會話,什么是一次會話呢?我舉個例子:就我們現在上網,打開瀏覽器瀏覽網站當時開始到你關閉瀏覽器,就稱之為一次會話;
也可以這么理解,當你在網上購物,瀏覽、選擇商品、付款、退出,這個就可以理解成一次會話;
一次開始到一次結束;
快速理解Session的執行機制
比如我現在客戶端向服務端發送一個請求,這個時候服務端就用會一個Session來跟你一一對應,下面我畫一張圖來解釋:

當張三用游覽器向服務器發送一個請求的時候,服務器會給它創建並分配一個Session,同時,李四也訪問服務器,這個時候服務器同時也會給李四創建並分配一個Session,兩個人一個一個相互獨立互不干擾。
分配給你的Session就是用來保存信息的,比如這個時候又來一個王五,王五給服務端發一個請求,這個時候我服務端又產生了一個Session用於保存王五的信息。
Session機制詳解
客戶端第一次請求服務端時,服務端會產生一個Session對象(用於保存該客戶信息);
並且每個Session對象都會有一個唯一的SessionID(用於區分其他Session);
服務端又會產生一個Cookie,並且該Cookie的name 就是寫死的 name = JSESSIONID它的value就是剛才Session的ID,valie = 服務端SessionID的值;
然后服務端會在響應客戶端的同時,將該Cookie發送給客戶端,至此客戶端就有了一個Cookie(JSESSIONID),這個JSESSIONID的值就是剛才SessionID的值;
因此,客戶端的Cookie就可以和服務器的Session一一對應起來了(【客戶端】JSESSIONID =【服務端】 SessionID);
這樣就可以保證每個人都擁有一個唯一的Session,來保存用戶的信息。
JSESSIONID詳解
那么,請求是如何相互對應的呢?這里我舉個例子,當張三第一次請求服務端時,它就會產生一個Session對象,Session對象他會自帶了一個SessionID,也就是Session產生的同時會帶一個SessionID;
這個時候SessionID會把SessionID復制了一份給了JSESSIONID,也就說,SessionID跟JSESSIONID的值是一模一樣的,這個時候它就會把JSESSIONID放到Cookie里面;
也就是我第一次請求時,會產生一個Session,並且Session會自帶一個SessionID,假設這個SessionID的值是1,這個時候SessionID 1 這個值又賦給了JSESSIONID,這時JSESSIONID的值也是1了,然后我服務端做出響應,上次我也說過,當我們響應的同時會將Cookie給發過去,
Cookie是由服務端產生,所以在響應的時候發給客戶端,這時,這個Cookie里面就包含我存的這個值1;
這個時候,我客戶端有一個1,我服務端也有一個1,這個時候不就一一對應起來了嗎,所以就不會亂,也就說我服務端的SessionID的1與客戶端的JSESSIONID的1一一對應用於區分客戶;
也就說,我客戶端與服務端是通過Session與Cookie對應起來的,Cookie里面的JSESSIONID和Session里面的Sessionid兩個相對應。如果還不理解請看我下發畫的圖:

客戶端的JSESSIONID與服務端的SessionID一一對應。
第二次請求
上面我一直在說第一次請求,那如果不是第一次呢?如果是第二次或者更多次呢?
第一次請求的時候給你一個Session對象,那我第二次呢?還需要給嗎?當然不需要了;
我第一次已經給你過Session了所以我第二次請求時,就不需要給你Session了,直接找你這個Session就完了;
怎么找?就是根據你的JSESSIONID(客戶端)和SessionID(服務端)進行匹配,如果匹配的時候發現客戶端JSESSIONID和在服務端存在的SessionID一模一樣,就可以說明這個人之前登錄成功過或曾經存在過;
因此我們上淘寶上京東我們就會發現,第一次登錄成功后第二次就無需登錄,一直保持在線狀態;
當我們第一次訪問京東時我登錄了,登錄完之后它馬上就給我一個Session,里面放用戶名密碼,因為創建的同時會有一個SessionID,假設這個SessionID的值是4,然后把這個4放到Cookie里面再發給客戶端,客戶端有個Cookie,我JSESSIONID是4,兩者對應起來后我就不需要再進行登錄操作了。
Session的重要核心機制
1.Session存儲在服務端
2.Session是在同一個用戶(客戶)請求是共享的【意思就是你第一次開櫃子匹配失敗發現你是新用戶就,給你分配了一把鑰匙,當你第二次去開的時候就無需再分配鑰匙,今天兩個小時之內你不停的去開櫃子都不需要再分配鑰匙,所以你的請求已經被共享了,只要你有鑰匙而且鑰匙的上的編號與櫃子編號相同,你就可以無限的去開櫃子】
3.實現機制:在第一次客戶請求時 產生一個Sessionid並賦值給Cookie的JSESSIONID,然后發給客戶端,最終通過Session的Sessionid和我們Cookie的JSESSIONID實現一個一一對應關系。
今日感悟:
頭等艙可以優先登機,銀行VIP可以不用排隊,
演唱會最貴的票同時位置也是最好的,
所以,
世界從不平等,
你有多努力,你就有多特殊
