簡單理解SESSION

網上對SESSION的介紹很多,但其描述往往偏重於某個角度,以至於像我這樣的菜鳥對SESSION的理解如盲人摸象一般,始終朦朦朧朧。“SESSION”到低是個什麼?經過學習,本人對SESSION終於有了一個簡單卻又清晰的認識。


瀏覽器進程(注1)和服務器進程(注2)進行通迅時,服務器進程爲了區別不同的瀏覽器進程,會通過瀏覽器進程的cookie功能(注3),給每個瀏覽器進程“起個名字”。具體就是當瀏覽器進程第一次訪問服務器進程,服務器進程會在瀏覽器進程cookie中創建一個"sessionID",同時在服務器上開闢一個該sessionID對應的存貯區域(注4)。之後每次該瀏覽器進程向服務器進程發送請求,服務器進程就能根據sessionID弄清楚訪客身份。最常見用法比如用戶登錄,服務器進程接到瀏覽器進程訪問請求後發現sessionID對應存貯區域中沒有登錄信息(注5),於是可以返回一個登錄界面要求客戶端輸入帳號和密碼。當瀏覽器進程向服務器進程提交了用戶輸入的帳號和密碼,服務器進程驗證後可以將驗證結果保存在sessionID對應存貯區域中,併爲之後該瀏覽器進程對服務器資源的訪問開啓綠燈。


綜上所述,"SESSION"包含了以下三個部分:

1.支持cookie功能的瀏覽器進程

2.響應瀏覽器進程的服務器進程

3.服務器進程爲cookie中SESSIONID開闢的對應存貯區域(數據結構)

   在java web中,可通過HttpServletRequest.getSession獲取到這個數據存貯區域;


注1:多年前在防頁面假死技術剛流行時,曾出現幾款多線程瀏覽器。你瀏覽器上打開多個窗口,但任務管理器裏只能看到一個瀏覽器進程。這種技術有防頁面假死功能,而且消耗的系統資源相對較少。不過多線程瀏覽器導致多個窗口共用一個SESSION,造成了應用的麻煩,再加上多線程瀏覽器在防假死上不如多進程瀏覽器徹底,所以多線程瀏覽器未能流行開來。


注2:服務器進程比如tomcat,它會加載我們web項目中的程序代碼,並在瀏覽器進程發送來請求後運行這些代碼。瀏覽器進程我們很難內窺其原理,但開源的tomcat網上有很多文章介紹其原理。


注3:理論上也可以通過URL重定向或隱藏表單什麼的來代替cookie,不過現實在中誰沒事去禁止瀏覽器的cookie功能呢?


注4:爲什麼不直接把數據全放瀏覽器進程cookie裏而要在服務器端開闢個對應存貯區域?當然是爲了安全。


注5:也可能第一次訪問SESSION尚未建立。HttpServletRequest.getSession可以使用參數“true”表示如果SESSION不存在則新建立一個SESSION。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章