深入解析Session工作原理及運行流程
一、session的概念及特點
session概念:在計算機中,尤其是在網(wǎng)絡(luò)應(yīng)用中,稱為“會話控制”。Session 對象存儲特定用戶會話所需的屬性及配置信息。說白了session就是一種可以維持服務(wù)器端的數(shù)據(jù)存儲技術(shù)。session主要有以下的這些特點:
session保存的位置是在服務(wù)端
session一般來說要配合cookie使用,如果用戶瀏覽器禁用了cookie,那么只能使用URL重寫來實現(xiàn)session的存儲功能
單純的使用session來存儲用戶回話信息,那么當用戶量較多時,session文件數(shù)量會很多,會存在session查詢慢的問題
本質(zhì)上:session技術(shù)就是一種基于后端有別于數(shù)據(jù)庫的臨時存儲技術(shù)
二、為什么要使用session
我們目前使用的互聯(lián)網(wǎng)應(yīng)用層協(xié)議基本上都是基于 HTTP 和 HTTPS 的,它們的本身是無狀態(tài)的, 只負責請求和響應(yīng)。 我告訴服務(wù)器我需要什么,服務(wù)器返回給我相應(yīng)的資源。 如果沒有額外處理的話, 服務(wù)器是不知道你是誰,更無法根據(jù)你是誰給你展現(xiàn)和你相關(guān)的內(nèi)容了。
HTTP 協(xié)議一開始被設(shè)計成這樣還是有一些歷史原因的,當時的互聯(lián)網(wǎng)多用于學術(shù)交流,只用于文章信息的展現(xiàn)之類的事情,遠沒有現(xiàn)在這么豐富多彩。所以在當時的背景下 HTTP 協(xié)議被設(shè)計成這樣其實也是很符合它的場景的。但隨著互聯(lián)網(wǎng)應(yīng)用越來越廣泛,應(yīng)用的形式也變得越來越多,我們的 Web 應(yīng)用不只限于提供簡單的信息展現(xiàn)了,還需要用戶能夠登錄,可以在論壇發(fā)帖子,在購物網(wǎng)站買東西等等。 這就需要 HTTP 協(xié)議能夠記錄用戶的狀態(tài)。也就是我們現(xiàn)在熟悉的 Session 由來。
三、session的工作原理
- 用戶第一次請求服務(wù)器時,服務(wù)器端會生成一個sessionid
- 服務(wù)器端將生成的sessionid返回給客戶端,通過set-cookie
- 客戶端收到sessionid會將它保存在cookie中,當客戶端再次訪問服務(wù)端時會帶上這個sessionid
- 當服務(wù)端再次接收到來自客戶端的請求時,會先去檢查是否存在sessionid,不存在就新建一個sessionid重復(fù)1,2的流程,如果存在就去遍歷服務(wù)端的session文件,找到與這個sessionid相對應(yīng)的文件,文件中的鍵值便是sessionid,值為當前用戶的一些信息
- 此后的請求都會交換這個 Session ID,進行有狀態(tài)的會話。
四、session與cookies區(qū)別
1、數(shù)據(jù)存放位置不同:
cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。e79fa5e98193e4b893e5b19e31333366306536
2、安全程度不同:
cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙,考慮到安全應(yīng)當使用session。
3、性能使用程度不同:
session會在一定時間內(nèi)保存在服務(wù)器上。當訪問增多,會比較占用你服務(wù)器的性能,考慮到減輕服務(wù)器性能方面,應(yīng)當使用cookie。
4、數(shù)據(jù)存儲大小不同:
單個cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie,而session則存儲與服務(wù)端,瀏覽器對其沒有限制。
5、會話機制不同
session會話機制:session會話機制是一種服務(wù)器端機制,它使用類似于哈希表(可能還有哈希表)的結(jié)構(gòu)來保存信息。
cookies會話機制:cookie是服務(wù)器存儲在本地計算機上的小塊文本,并隨每個請求發(fā)送到同一服務(wù)器。 Web服務(wù)器使用HTTP標頭將cookie發(fā)送到客戶端。在客戶端終端,瀏覽器解析cookie并將其保存為本地文件,該文件自動將來自同一服務(wù)器的任何請求綁定到這些cookie。
五、session的生命周期
Session何時生效:
Sessinon在用戶訪問第一次訪問服務(wù)器時創(chuàng)建,需要注意只有訪問JSP、Servlet等程序時才會創(chuàng)建Session,只訪問HTML、IMAGE等靜態(tài)資源并不會創(chuàng)建Session,可調(diào)用request.getSession(true)強制生成Session。
Session何時失效:
1.服務(wù)器會把長時間沒有活動的Session從服務(wù)器內(nèi)存中清除,此時Session便失效。Tomcat中Session的默認失效時間為20分鐘。從session不活動的時候開始計算,如果session一直活動,session就總不會過期。從該Session未被訪問,開始計時; 一旦Session被訪問,計時清0;
2.調(diào)用Session的invalidate方法
HttpSession session = request.getSession();
session.invalidate();//注銷該request的所有session
3.設(shè)置session的失效時間
a)web.xml中
<session-config>
<session-timeout>30</session-timeout>
</session-config>
b)在程序中手動設(shè)置
session.setMaxInactiveInterval(30 * 60);//設(shè)置單位為秒,設(shè)置為-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.關(guān)閉瀏覽器,session就會失效
六、session的性能瓶頸
另外一個要聊聊的就是 Session 數(shù)據(jù)的存儲。 通常情況下,如果你不明確的設(shè)置, 大多數(shù) Web 框架會把 Session 數(shù)據(jù)存放到內(nèi)存中。如果你的 Web 應(yīng)用用戶量不大的話,這也不成問題。 但如果你的用戶數(shù)比較大的話,就可能發(fā)生一個事情 — 內(nèi)存不夠用了。
這很正常,內(nèi)存容量是非常寶貴的,假設(shè)每個用戶的 Session 數(shù)據(jù)是 100K, 1萬個用戶就會大概占用 1G 的存儲空間,如果你的 Session 數(shù)據(jù)清理機制也恰巧比較慢的話,內(nèi)存非常容易被占滿。這就需要你在設(shè)計比較大并發(fā)量的站點時,要考慮 Session 的存儲方式,比如把它們保存到硬盤文件系統(tǒng)中,或者數(shù)據(jù)庫中。 所以你在開發(fā)一個 Web 應(yīng)用的時候,如果你的用戶量很大,你需要有這個意識。另外 Session 放到內(nèi)存中還有一個弊端,如果你的 Web 服務(wù)器發(fā)生重啟,那么所有的 Session 狀態(tài)都會被情況,會在一定程度上影響用戶體驗。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入學習JavaWeb中監(jiān)聽器(Listener)的使用方法
這篇文章主要為大家詳細介紹了深入學習JavaWeb中監(jiān)聽器(Listener)的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09關(guān)于Idea創(chuàng)建Java項目并引入lombok包的問題(lombok.jar包免費下載)
很多朋友遇到當idea創(chuàng)建java項目時,命名安裝了lombok插件卻不能使用注解,原因有兩個大家可以參考下本文,本文對每種原因分析給出了解決方案,需要的朋友參考下吧2021-06-06java中functional interface的分類和使用詳解
這篇文章主要介紹了java中functional interface的分類和使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04Java異常處理之try...catch...語句的使用進階
這篇文章主要介紹了Java異常處理之try...catch...語句的使用進階,重點在于牽扯相關(guān)IO使用時的資源調(diào)配情況,需要的朋友可以參考下2015-11-11springboot?maven?plugin報紅的解決辦法
本文主要介紹了springboot?maven?plugin報紅的解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07