Session基礎知識html
主題數據庫
概念瀏覽器
Session的建立tomcat
Session的存儲機制服務器
Session的失效cookie
參考資料session
概念spa
Session表明一次用戶會話。一次用戶會話的含義是:從客戶端瀏覽器鏈接服務器開始,到客戶端瀏覽器與服務端斷開爲止,這個過程就是一次會話。htm
Session機制採用的是在服務端保存狀態的方法。對象
Session的建立
當客戶端向服務器發送一個請求時,服務器首先檢查請求裏是否包含SessionID,若是包含了SessionID則說明該客戶端已經登陸過而且服務端爲此客戶端建立了一個Session,服務器就依照SessionID將這個Session在服務器中找出來(若是找不到,就有可能爲他新建立一個)。若是客戶端請求裏不包含SessionID,則爲該客戶新建立一個Session並生成一個與此Session相關的SessionID。這個SessionID是不重複的,惟一的,不容易找到規律的字符串。這個SessionID將在本次響應中返回到客戶端保存。
Session是在服務端調用HttpServletRequest.getSession(true);這樣的語句時才被建立,若是JSP沒有顯式的使用<%@page Session=」false」%> 關閉Session,則JSP文件在編譯成Servlet時將會自動加上HttpServletRequest.getSession(true);這就是JSP內置對象session的由來。
Session的存儲機制
通常狀況下,Session都是存儲在內存中,當服務器進程被中止或者重啓的時候,內存裏的Session也會被清空。若是設置了Session的持久化特性,服務器就會把Session保存到硬盤上,當服務器進程從新啓動後Session裏的信息可以被再次使用。
Session的存儲方式及各存儲方式下Session屬性值是否須要可序列化:
InProc(默認) :不須要序列化,存放在IIS進程中(內存),重啓IIS服務器時會話狀態消失。
SQLServer:須要序列化,存放在數據庫中,存儲在硬盤中。
StateServer:須要序列化, 存放在Asp.Net狀態服務進程中,重啓Web應用時保留會話狀態。
Session的失效
Session在下列狀況下失效:
程序調用HttpSession.invalidate();
距離上一次收到客戶端發送的SesionID時間間隔超過了Session的超時設置,tomcat默認session超時時間爲30分鐘;
服務器進程被中止(非持久Session);
咱們常說打開瀏覽器就建立了一個Session,關閉瀏覽器時Session也被刪除,事實上,除非程序通知服務器刪除Session,不然Session會被服務器一直保留,直到Session的失效時間到了自動刪除。服務器不知道瀏覽器被關閉,瀏覽器不會主動地在其關閉以前通知服務器它將要關閉。程序通常是在用戶註銷後刪除Session。咱們產生這種錯覺地緣由是:通常Session機制都使用cookie來保存SessionID,而一旦關閉瀏覽器,SessionID就不存在了,再鏈接服務器時找不到原來的Session了。若是cookie保存在硬盤中,或者用某種手段改寫瀏覽器發出的 HTTP請求頭,把原來的SessionID發送給服務器,則再次打開瀏覽器仍然可以找到原來的Session。
偏偏因爲關閉瀏覽器時不會讓Session被刪除,迫使服務器爲Session設置了一個失效時間。當距離客戶端上一次使用Session的時間超過失效時間,服務器就認爲客戶端已經中止了活動,纔會把Session刪除以節省存儲空間。
參考資料
http://www.cnblogs.com/literoad/archive/2012/05/13/2498528.html