深入解析Session工作原理及運(yùn)行流程
一、session的概念及特點(diǎn)
session概念:在計算機(jī)中,尤其是在網(wǎng)絡(luò)應(yīng)用中,稱為“會話控制”。Session 對象存儲特定用戶會話所需的屬性及配置信息。說白了session就是一種可以維持服務(wù)器端的數(shù)據(jù)存儲技術(shù)。session主要有以下的這些特點(diǎn):
session保存的位置是在服務(wù)端
session一般來說要配合cookie使用,如果用戶瀏覽器禁用了cookie,那么只能使用URL重寫來實現(xiàn)session的存儲功能
單純的使用session來存儲用戶回話信息,那么當(dāng)用戶量較多時,session文件數(shù)量會很多,會存在session查詢慢的問題
本質(zhì)上:session技術(shù)就是一種基于后端有別于數(shù)據(jù)庫的臨時存儲技術(shù)
二、為什么要使用session
我們目前使用的互聯(lián)網(wǎng)應(yīng)用層協(xié)議基本上都是基于 HTTP 和 HTTPS 的,它們的本身是無狀態(tài)的, 只負(fù)責(zé)請求和響應(yīng)。 我告訴服務(wù)器我需要什么,服務(wù)器返回給我相應(yīng)的資源。 如果沒有額外處理的話, 服務(wù)器是不知道你是誰,更無法根據(jù)你是誰給你展現(xiàn)和你相關(guān)的內(nèi)容了。
HTTP 協(xié)議一開始被設(shè)計成這樣還是有一些歷史原因的,當(dāng)時的互聯(lián)網(wǎng)多用于學(xué)術(shù)交流,只用于文章信息的展現(xiàn)之類的事情,遠(yuǎn)沒有現(xiàn)在這么豐富多彩。所以在當(dāng)時的背景下 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中,當(dāng)客戶端再次訪問服務(wù)端時會帶上這個sessionid
- 當(dāng)服務(wù)端再次接收到來自客戶端的請求時,會先去檢查是否存在sessionid,不存在就新建一個sessionid重復(fù)1,2的流程,如果存在就去遍歷服務(wù)端的session文件,找到與這個sessionid相對應(yīng)的文件,文件中的鍵值便是sessionid,值為當(dāng)前用戶的一些信息
- 此后的請求都會交換這個 Session ID,進(jìn)行有狀態(tài)的會話。
四、session與cookies區(qū)別
1、數(shù)據(jù)存放位置不同:
cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。e79fa5e98193e4b893e5b19e31333366306536
2、安全程度不同:
cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙,考慮到安全應(yīng)當(dāng)使用session。
3、性能使用程度不同:
session會在一定時間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能,考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用cookie。
4、數(shù)據(jù)存儲大小不同:
單個cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點(diǎn)最多保存20個cookie,而session則存儲與服務(wù)端,瀏覽器對其沒有限制。

5、會話機(jī)制不同
session會話機(jī)制:session會話機(jī)制是一種服務(wù)器端機(jī)制,它使用類似于哈希表(可能還有哈希表)的結(jié)構(gòu)來保存信息。
cookies會話機(jī)制:cookie是服務(wù)器存儲在本地計算機(jī)上的小塊文本,并隨每個請求發(fā)送到同一服務(wù)器。 Web服務(wù)器使用HTTP標(biāo)頭將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)強(qiáng)制生成Session。
Session何時失效:
1.服務(wù)器會把長時間沒有活動的Session從服務(wù)器內(nèi)存中清除,此時Session便失效。Tomcat中Session的默認(rèn)失效時間為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ù)清理機(jī)制也恰巧比較慢的話,內(nèi)存非常容易被占滿。這就需要你在設(shè)計比較大并發(fā)量的站點(diǎn)時,要考慮 Session 的存儲方式,比如把它們保存到硬盤文件系統(tǒng)中,或者數(shù)據(jù)庫中。 所以你在開發(fā)一個 Web 應(yīng)用的時候,如果你的用戶量很大,你需要有這個意識。另外 Session 放到內(nèi)存中還有一個弊端,如果你的 Web 服務(wù)器發(fā)生重啟,那么所有的 Session 狀態(tài)都會被情況,會在一定程度上影響用戶體驗。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
新手學(xué)習(xí)JQuery基本操作和使用案例解析
這篇文章主要介紹了新手學(xué)習(xí)JQuery基本操作和使用案例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
Spring中@EnableScheduling實現(xiàn)定時任務(wù)代碼實例
這篇文章主要介紹了Spring中@EnableScheduling實現(xiàn)定時任務(wù)代碼實例,@EnableScheduling 注解開啟定時任務(wù)功能,可以將多個方法寫在一個類,也可以分多個類寫,當(dāng)然也可以將方法直接寫在上面ScheddulConfig類中,需要的朋友可以參考下2024-01-01
MyBatis?Plus實現(xiàn)中文排序的兩種有效方法
在MyBatis?Plus項目開發(fā)中,針對中文數(shù)據(jù)的排序需求是一個常見的挑戰(zhàn),尤其是在需要按照拼音或特定語言邏輯排序時,本文整合了兩種有效的方法,旨在幫助開發(fā)者克服MyBatis?Plus在處理中文排序時遇到的障礙,需要的朋友可以參考下2024-08-08
SpringBoot實現(xiàn)密碼安全存儲的五種方式小結(jié)
項目開發(fā)中,密碼安全存儲是非常關(guān)鍵的一環(huán),作為開發(fā)者,我們需要確保用戶的密碼在存儲時被安全地加密,避免因數(shù)據(jù)泄露而造成嚴(yán)重后果,所以本文給大家介紹了SpringBoot實現(xiàn)密碼安全存儲的5種方式,需要的朋友可以參考下2025-03-03
Java使用itext生成復(fù)雜數(shù)據(jù)的pdf的示例代碼
Apache iText 是一個開源 Java 庫,支持 PDF 文檔的開發(fā)和轉(zhuǎn)換,在本教程中,我們將學(xué)習(xí)如何使用 iText 開發(fā)可以創(chuàng)建、轉(zhuǎn)換和操作 PDF 文檔的 Java 程序,感興趣的小伙伴跟著小編一起來看看吧2024-12-12
Java報錯Non-terminating?decimal?expansion解決分析
這篇文章主要為大家介紹了Java報錯Non-terminating?decimal?expansion解決方案及原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

