歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Session的理解

一、    個人誤區

一開始很傻的把Session的會話與用戶的登錄與退出弄混淆了,實在很傻!Session的會話指的是當你打開浏覽器,請求一個應用服務器時開始,直到與這個應用服務器斷開連接(如關閉浏覽器等)為止的一系列動作。這與用戶登錄完全沒有關系,被弄混淆個人覺得是Session最普遍的用法就是用來控制用戶的登錄/退出事件的。

二、    Session的理解

1、  Session的機制、創建以及保存

Session機制是一種服務器端的機制,服務器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。當程序需要為某個客戶端的請求創建一個Session的時候,服務器首先檢查這個客戶端的請求裡是否已包含了一個Session標識 - 稱為 Session id,如果已包含一個Session id則說明以前已經為此客戶端創建過Session,服務器就按照Session id把這個 Session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含Session id,則為此客戶端創建一個Session並且生 成一個與此Session相關聯的Session id,Session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個 Session id將被在本次響應中返回給客戶端保存(客戶端一般使用Cookie保存)。

例如:當你打開浏覽器時,然後輸入一個地址,這個地址其實對應的是一個服務器,當你的請求被服務器響應之後,如上所說服務器首先會根據你發送的請求是否包含一個Session標識(Session-Id),如果有則不新建Session,但若是沒有則新建一個Session,並將該Session的ID返回給客戶端(浏覽器),客戶端就將該Session-Id保存到一個Cookie中(一般這個cookie的名字都是類似於SEEESIONID,而。比如weblogic對於web應用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID),然後每次客戶端請求一個新的頁面時就將該Cookie通過某種機制發送給服務器端,服務器端就知道Session已經創建了,從而不需要再新建一個Session。

2、  Session的銷毀

Session的銷毀並不是在浏覽器窗口被關閉時。對於Session的銷毀除非程序顯示的告訴服務器銷毀Session,否則服務器不會主動銷毀一個Session。

然而浏覽器從來不會主動在關閉之前通知服務器它將要關閉,因此服務器根本不會有機會知道浏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉浏覽器後這個 session id就消失了,再次連接服務器時也就無法找到原來的session。如果服務器設置的cookie被保存到硬盤上,或者使用某種手段改寫浏覽器發出的HTTP請求頭,把原來的session id發送給服務器,則再次打開浏覽器仍然能夠找到原來的Session。

Session被銷毀的另一個原因就是為Session設置了失效時間,即當距離客戶端上一次使用Session的時間超過這個失效時間時,服務器就可以認為客戶端已經停止了活動,才會把Session銷毀以節省存儲空間。此時當用戶再次訪問時,如刷新頁面、再次訪問等,服務器會重新創建一個Session,並生成一個新的ID。

說明(實驗得出,IE8,Google):當你訪問一個服務器之後,關閉窗口(所有浏覽器窗口,如IE,那就關閉所有IE窗口,一個不留),然後再打開訪問同樣的服務器,這時雖然上一個Session可能未被銷毀,但是服務器找不到,因此就會再新建一個Session,這時會有兩個Session。但是如果你未完全關不窗口的話,那麼就會使用之前的Session。原因是Session-Id是保存在一個Cookie中的(測試時該Cookie名為JSESSIONID),而這個Cookie的生命周期為浏覽器關閉,即浏覽器關閉(完全關閉)則該Cookie就會被刪除,因此服務器無法通過這個Cookie找到Session-Id,這時服務器就會認為沒有Session存在,就會新建一個Session。同時這個Session的Id會覆蓋之前的Session-Id,因為使用的是同一個Cookie,而Cookie會覆蓋。

自己可以做試驗!在IE和Google中都是可以查看Cookie的!

個人理解,有錯歡迎指出!

 

Copyright © Linux教程網 All Rights Reserved