session的工作原理


一、session的概念及特點

  session概念:在計算機中,尤其是在網絡應用中,稱為“會話控制”。Session 對象存儲特定用戶會話所需的屬性及配置信息。說白了session就是一種可以維持服務器端的數據存儲技術。session主要有以下的這些特點:

  1. session保存的位置是在服務端
  2. session一般來說要配合cookie使用,如果用戶瀏覽器禁用了cookie,那么只能使用URL重寫來實現session的存儲功能

  3. 單純的使用session來存儲用戶回話信息,那么當用戶量較多時,session文件數量會很多,會存在session查詢慢的問題

本質上:session技術就是一種基於后端有別於數據庫的臨時存儲技術

二、為什么要使用session

  我們目前使用的互聯網應用層協議基本上都是基於 HTTP 和 HTTPS 的,它們的本身是無狀態的, 只負責請求和響應。 我告訴服務器我需要什么,服務器返回給我相應的資源。 如果沒有額外處理的話, 服務器是不知道你是誰,更無法根據你是誰給你展現和你相關的內容了。HTTP 協議一開始被設計成這樣還是有一些歷史原因的,當時的互聯網多用於學術交流,只用於文章信息的展現之類的事情,遠沒有現在這么豐富多彩。所以在當時的背景下 HTTP 協議被設計成這樣其實也是很符合它的場景的。但隨着互聯網應用越來越廣泛,應用的形式也變得越來越多,我們的 Web 應用不只限於提供簡單的信息展現了,還需要用戶能夠登錄,可以在論壇發帖子,在購物網站買東西等等。 這就需要 HTTP 協議能夠記錄用戶的狀態。也就是我們現在熟悉的 Session 由來。

三、session的工作原理

  1. 用戶第一次請求服務器時,服務器端會生成一個sessionid
  2. 服務器端將生成的sessionid返回給客戶端,通過set-cookie
  3. 客戶端收到sessionid會將它保存在cookie中,當客戶端再次訪問服務端時會帶上這個sessionid
  4. 當服務端再次接收到來自客戶端的請求時,會先去檢查是否存在sessionid,不存在就新建一個sessionid重復1,2的流程,如果存在就去遍歷服務端的session文件,找到與這個sessionid相對應的文件,文件中的鍵值便是sessionid,值為當前用戶的一些信息
  5. 此后的請求都會交換這個 Session ID,進行有狀態的會話。

四、session的生命周期

Session何時生效:
Sessinon在用戶訪問第一次訪問服務器時創建,需要注意只有訪問JSP、Servlet等程序時才會創建Session,只訪問HTML、IMAGE等靜態資源並不會創建Session,可調用request.getSession(true)強制生成Session。

Session何時失效:
1.服務器會把長時間沒有活動的Session從服務器內存中清除,此時Session便失效。Tomcat中Session的默認失效時間為20分鍾。從session不活動的時候開始計算,如果session一直活動,session就總不會過期。從該Session未被訪問,開始計時; 一旦Session被訪問,計時清0;

2.調用Session的invalidate方法

HttpSession session = request.getSession();
session.invalidate();//注銷該request的所有session

4.設置session的失效時間

a)web.xml中

<session-config>
<session-timeout>30</session-timeout>
</session-config>

b)在程序中手動設置

session.setMaxInactiveInterval(30 * 60);//設置單位為秒,設置為-1永不過期

request.getSession().setMaxInactiveInterval(-1);//永不過期

c)tomcat也可以修改session過期時間,在server.xml中定義context時采用如下定義:

<Context path="/livsorder" 
docBase="/home/httpd/html/livsorder"   defaultSessionTimeOut="3600" 
isWARExpanded="true"   
isWARValidated="false" isInvokerEnabled="true"   isWorkDirPersistent="false"/>

5.關閉瀏覽器,session就會失效

五、session的性能瓶頸

  另外一個要聊聊的就是 Session 數據的存儲。 通常情況下,如果你不明確的設置, 大多數 Web 框架會把 Session 數據存放到內存中。如果你的 Web 應用用戶量不大的話,這也不成問題。 但如果你的用戶數比較大的話,就可能發生一個事情 — 內存不夠用了。這很正常,內存容量是非常寶貴的,假設每個用戶的 Session 數據是 100K, 1萬個用戶就會大概占用 1G 的存儲空間,如果你的 Session 數據清理機制也恰巧比較慢的話,內存非常容易被占滿。這就需要你在設計比較大並發量的站點時,要考慮 Session 的存儲方式,比如把它們保存到硬盤文件系統中,或者數據庫中。 所以你在開發一個 Web 應用的時候,如果你的用戶量很大,你需要有這個意識。另外 Session 放到內存中還有一個弊端,如果你的 Web 服務器發生重啟,那么所有的 Session 狀態都會被情況,會在一定程度上影響用戶體驗。

六、session實現登錄狀態的控制

  假設瀏覽器第一次請求服務器需要輸入用戶名與密碼驗證身份,服務器拿到用戶名密碼去數據庫比對,正確的話說明當前持有這個會話的用戶是合法用戶,應該將這個會話標記為“已授權”或者“已登錄”等等之類的狀態,既然是會話的狀態,自然要保存在會話對象中,tomcat在會話對象中設置登錄狀態如下,用戶再次訪問時,tomcat在會話對象中查看登錄狀態。

 

 

 每次請求受保護資源時都會檢查會話對象中的登錄狀態,只有 isLogin=true 的會話才能訪問,登錄機制因此而實現。

 

 

 

參考鏈接:深度解剖session運行原理

     HTTP Session 的工作原理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM