1. 程式人生 > 程式設計 >深入解析Session工作原理及執行流程

深入解析Session工作原理及執行流程

一、session的概念及特點

  session概念:在計算機中,尤其是在網路應用中,稱為“會話控制”。Session 物件儲存特定使用者會話所需的屬性及配置資訊。說白了session就是一種可以維持伺服器端的資料儲存技術。session主要有以下的這些特點:

session儲存的位置是在服務端

session一般來說要配合cookie使用,如果使用者瀏覽器禁用了cookie,那麼只能使用URL重寫來實現session的儲存功能

單純的使用session來儲存使用者回話資訊,那麼當用戶量較多時,session檔案數量會很多,會存在session查詢慢的問題

本質上:session技術就是一種基於後端有別於資料庫的臨時儲存技術

二、為什麼要使用session

  我們目前使用的網際網路應用層協議基本上都是基於 HTTP 和 HTTPS 的,它們的本身是無狀態的, 只負責請求和響應。 我告訴伺服器我需要什麼,伺服器返回給我相應的資源。 如果沒有額外處理的話, 伺服器是不知道你是誰,更無法根據你是誰給你展現和你相關的內容了。

HTTP 協議一開始被設計成這樣還是有一些歷史原因的,當時的網際網路多用於學術交流,只用於文章資訊的展現之類的事情,遠沒有現在這麼豐富多彩。所以在當時的背景下 HTTP 協議被設計成這樣其實也是很符合它的場景的。但隨著網際網路應用越來越廣泛,應用的形式也變得越來越多,我們的 Web 應用不只限於提供簡單的資訊展現了,還需要使用者能夠登入,可以在論壇發帖子,在購物網站買東西等等。 這就需要 HTTP 協議能夠記錄使用者的狀態。也就是我們現在熟悉的 Session 由來。

三、session的工作原理

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

四、session與cookies區別

1、資料存放位置不同:

cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。e79fa5e98193e4b893e5b19e31333366306536

2、安全程度不同:

cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session。

3、效能使用程度不同:

session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,考慮到減輕伺服器效能方面,應當使用cookie。

4、資料儲存大小不同:

單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie,而session則儲存與服務端,瀏覽器對其沒有限制。

深入解析Session工作原理及執行流程

5、會話機制不同

session會話機制:session會話機制是一種伺服器端機制,它使用類似於雜湊表(可能還有雜湊表)的結構來儲存資訊。

cookies會話機制:cookie是伺服器儲存在本地計算機上的小塊文字,並隨每個請求傳送到同一伺服器。 Web伺服器使用HTTP標頭將cookie傳送到客戶端。在客戶端終端,瀏覽器解析cookie並將其儲存為本地檔案,該檔案自動將來自同一伺服器的任何請求繫結到這些cookie。

五、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

3.設定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"/>

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

六、session的效能瓶頸

  另外一個要聊聊的就是 Session 資料的儲存。 通常情況下,如果你不明確的設定, 大多數 Web 框架會把 Session 資料存放到記憶體中。如果你的 Web 應用使用者量不大的話,這也不成問題。 但如果你的使用者數比較大的話,就可能發生一個事情 — 記憶體不夠用了。

這很正常,記憶體容量是非常寶貴的,假設每個使用者的 Session 資料是 100K, 1萬個使用者就會大概佔用 1G 的儲存空間,如果你的 Session 資料清理機制也恰巧比較慢的話,記憶體非常容易被佔滿。這就需要你在設計比較大併發量的站點時,要考慮 Session 的儲存方式,比如把它們儲存到硬碟檔案系統中,或者資料庫中。 所以你在開發一個 Web 應用的時候,如果你的使用者量很大,你需要有這個意識。另外 Session 放到記憶體中還有一個弊端,如果你的 Web 伺服器發生重啟,那麼所有的 Session 狀態都會被情況,會在一定程度上影響使用者體驗。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。