自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:如何理解 OSI 七層模型和 TCP/IP 四層模型?HTTP 作為如何保存用戶狀態(tài)?多服務(wù)器節(jié)點(diǎn)下 Session 方案怎么做

網(wǎng)絡(luò)
OSI 七層模型是一種用于理解和實(shí)現(xiàn)網(wǎng)絡(luò)通信的分層模型,它將網(wǎng)絡(luò)通信過程劃分為七個(gè)獨(dú)立的功能層。每一層專注于完成特定的任務(wù),并為上一層提供服務(wù),同時(shí)依賴下一層的支持。

一、面試官:OSI 七層模型是什么?每一層的作用是什么?TCP/IP四層模型和OSI七層模型的區(qū)別是什么?

OSI(開放系統(tǒng)互聯(lián))七層模型是一種用于理解和實(shí)現(xiàn)網(wǎng)絡(luò)通信的分層模型,它將網(wǎng)絡(luò)通信過程劃分為七個(gè)獨(dú)立的功能層。每一層專注于完成特定的任務(wù),并為上一層提供服務(wù),同時(shí)依賴下一層的支持。以下是OSI七層模型的詳細(xì)描述及其每一層的作用:

1. 應(yīng)用層(Application Layer)

作用:應(yīng)用層是OSI模型的最高層,直接與用戶交互,提供網(wǎng)絡(luò)服務(wù)和應(yīng)用程序接口。

關(guān)鍵功能:

  • 提供用戶訪問網(wǎng)絡(luò)資源的接口。
  • 支持文件傳輸、電子郵件、遠(yuǎn)程登錄等功能。

典型協(xié)議:HTTP(超文本傳輸協(xié)議)、FTP(文件傳輸協(xié)議)、SMTP(簡單郵件傳輸協(xié)議)、DNS(域名系統(tǒng))。

2. 表示層(Presentation Layer)

作用:表示層負(fù)責(zé)數(shù)據(jù)格式的轉(zhuǎn)換、加密和壓縮,以確保數(shù)據(jù)能夠在不同系統(tǒng)之間正確解釋。

關(guān)鍵功能:

  • 數(shù)據(jù)編碼和解碼(如ASCII、EBCDIC)。
  • 數(shù)據(jù)加密和解密(如SSL/TLS)。
  • 數(shù)據(jù)壓縮和解壓縮。

典型協(xié)議:SSL/TLS。

3. 會(huì)話層(Session Layer)

作用:會(huì)話層負(fù)責(zé)建立、管理和終止應(yīng)用程序之間的會(huì)話(通信會(huì)話)。

關(guān)鍵功能:

  • 控制會(huì)話的建立、維護(hù)和斷開。
  • 提供會(huì)話同步和檢查點(diǎn)功能(如斷點(diǎn)續(xù)傳)。

典型協(xié)議:NetBIOS、RPC(遠(yuǎn)程過程調(diào)用)、PPTP(點(diǎn)對(duì)點(diǎn)隧道協(xié)議)。

4. 傳輸層(Transport Layer)

作用:傳輸層負(fù)責(zé)端到端的通信,確保數(shù)據(jù)完整、有序地從源主機(jī)傳輸?shù)侥繕?biāo)主機(jī)。

關(guān)鍵功能:

  • 提供可靠的數(shù)據(jù)傳輸(如TCP)或不可靠的數(shù)據(jù)傳輸(如UDP)。
  • 實(shí)現(xiàn)流量控制和錯(cuò)誤恢復(fù)。
  • 數(shù)據(jù)分段和重組。

典型協(xié)議:

  • TCP(傳輸控制協(xié)議):面向連接,可靠傳輸。
  • UDP(用戶數(shù)據(jù)報(bào)協(xié)議):無連接,快速但不可靠。

5. 網(wǎng)絡(luò)層(Network Layer)

作用:網(wǎng)絡(luò)層負(fù)責(zé)數(shù)據(jù)包的路由選擇和轉(zhuǎn)發(fā),確保數(shù)據(jù)能夠從源主機(jī)到達(dá)目標(biāo)主機(jī)。

關(guān)鍵功能:

  • 提供邏輯地址(如IP地址)。
  • 路由選擇和數(shù)據(jù)包轉(zhuǎn)發(fā)。
  • 分段和重組數(shù)據(jù)包。

典型協(xié)議/設(shè)備:

  • 設(shè)備:路由器。
  • 協(xié)議:IP(IPv4/IPv6)、ICMP、ARP。

6. 數(shù)據(jù)鏈路層(Data Link Layer)

作用:數(shù)據(jù)鏈路層負(fù)責(zé)在相鄰節(jié)點(diǎn)之間可靠地傳輸數(shù)據(jù)幀,并處理物理層可能引入的錯(cuò)誤(如比特錯(cuò)誤)。

關(guān)鍵功能:

  • 將比特流封裝成幀。
  • 實(shí)現(xiàn)流量控制和錯(cuò)誤檢測與糾正。
  • 定義MAC地址(媒體訪問控制地址)以標(biāo)識(shí)設(shè)備。

典型協(xié)議/設(shè)備:

  • 設(shè)備:交換機(jī)、網(wǎng)橋。
  • 協(xié)議:以太網(wǎng)(Ethernet)、PPP(點(diǎn)對(duì)點(diǎn)協(xié)議)、HDLC。

7. 物理層(Physical Layer)

作用:物理層負(fù)責(zé)在物理介質(zhì)上傳輸原始的比特流(0和1)。它定義了硬件設(shè)備(如網(wǎng)卡、電纜等)之間的電氣、機(jī)械、功能和規(guī)程特性。

關(guān)鍵功能:

  • 定義電壓、接口、電纜標(biāo)準(zhǔn)等。
  • 實(shí)現(xiàn)比特流的傳輸和接收。
  • 提供物理連接的建立、維護(hù)和釋放。

典型協(xié)議/設(shè)備:

  • 設(shè)備:中繼器、集線器

OSI七層模型通過分層的方式,將復(fù)雜的網(wǎng)絡(luò)通信任務(wù)分解為多個(gè)獨(dú)立的功能模塊。每一層都專注于完成特定的任務(wù),并為上一層提供支持。這種分層設(shè)計(jì)使得不同的網(wǎng)絡(luò)協(xié)議和設(shè)備可以協(xié)同工作,從而實(shí)現(xiàn)跨網(wǎng)絡(luò)的通信。

  • 高三層(應(yīng)用層、表示層、會(huì)話層)更接近用戶,負(fù)責(zé)提供高級(jí)的網(wǎng)絡(luò)服務(wù)和數(shù)據(jù)處理功能。
  • 低三層(傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層)主要負(fù)責(zé)網(wǎng)絡(luò)通信的基礎(chǔ)部分,包括數(shù)據(jù)的傳輸、路由和鏈路管理。

8. TCP/IP四層模型

從下到上分為四層:

  • 網(wǎng)絡(luò)接口層:對(duì)應(yīng)OSI的物理層和數(shù)據(jù)鏈路層,負(fù)責(zé)硬件相關(guān)的數(shù)據(jù)傳輸。
  • 網(wǎng)絡(luò)層:對(duì)應(yīng)OSI的網(wǎng)絡(luò)層,負(fù)責(zé)數(shù)據(jù)包的路由和轉(zhuǎn)發(fā)(如IP協(xié)議)。
  • 傳輸層:對(duì)應(yīng)OSI的傳輸層,提供端到端的通信(如TCP、UDP協(xié)議)。
  • 應(yīng)用層:整合了OSI的應(yīng)用層、表示層和會(huì)話層功能,直接面向用戶(如HTTP、DNS)。

對(duì)比維度

OSI七層模型

TCP/IP四層模型

來源與理念

理論化,先有模型后有協(xié)議

實(shí)用化,先有協(xié)議后有模型

層次劃分

七層(物理層到應(yīng)用層)

四層(網(wǎng)絡(luò)接口層到應(yīng)用層)

功能整合

細(xì)粒度劃分,功能獨(dú)立

高三層合并為應(yīng)用層,功能集成

實(shí)際應(yīng)用

教學(xué)與理論研究為主

互聯(lián)網(wǎng)通信的基礎(chǔ),廣泛使用

協(xié)議支持

無具體協(xié)議綁定

明確綁定具體協(xié)議(如TCP、IP)

數(shù)據(jù)封裝

每層獨(dú)立封裝,過程較繁瑣

封裝過程簡潔,效率更高

OSI七層模型更適合用于學(xué)習(xí)和理解網(wǎng)絡(luò)通信的基本原理,而TCP/IP四層模型則因其高效性和實(shí)用性,成為現(xiàn)代網(wǎng)絡(luò)通信的實(shí)際標(biāo)準(zhǔn)。

二、面試官:HTTP 本身是無狀態(tài)協(xié)議,HTTP如何保存用戶狀態(tài)?

HTTP 是一種無狀態(tài)(stateless)協(xié)議,這意味著每個(gè)請(qǐng)求和響應(yīng)之間是相互獨(dú)立的,服務(wù)器不會(huì)自動(dòng)保存用戶的會(huì)話狀態(tài)。然而,在實(shí)際應(yīng)用中,為了實(shí)現(xiàn)用戶狀態(tài)的保存(如登錄狀態(tài)、購物車信息等),通常采用以下幾種機(jī)制:

1. 使用 Cookie

原理:服務(wù)器通過在 HTTP 響應(yīng)頭中設(shè)置 Set-Cookie 字段,將用戶的狀態(tài)信息存儲(chǔ)到客戶端??蛻舳嗽诤罄m(xù)請(qǐng)求中會(huì)自動(dòng)攜帶該 Cookie,從而實(shí)現(xiàn)狀態(tài)的傳遞。

示例:

  • 服務(wù)器返回響應(yīng)時(shí)設(shè)置 Set-Cookie: sessinotallow=abc123; Path=/; HttpOnly。
  • 客戶端在下次請(qǐng)求時(shí)會(huì)在請(qǐng)求頭中添加 Cookie: sessinotallow=abc123。

優(yōu)點(diǎn):

  • 簡單易用,適合保存少量數(shù)據(jù)。
  • 支持過期時(shí)間、域名限制等安全特性。

缺點(diǎn):數(shù)據(jù)存儲(chǔ)在客戶端,可能被篡改或竊?。ㄐ枧浜霞用芑蚝灻褂茫?。

2. 使用 Session

原理:服務(wù)器為每個(gè)用戶生成一個(gè)唯一的會(huì)話標(biāo)識(shí)符(Session ID),并通過 Cookie 或 URL 重寫的方式發(fā)送給客戶端。實(shí)際的用戶狀態(tài)信息(如登錄信息)存儲(chǔ)在服務(wù)器端,客戶端僅保存 Session ID。

示例:

  • 用戶登錄后,服務(wù)器生成一個(gè) Session 并返回 Set-Cookie: sessinotallow=xyz456。
  • 客戶端在后續(xù)請(qǐng)求中攜帶 Cookie: sessinotallow=xyz456,服務(wù)器根據(jù) ID 檢索對(duì)應(yīng)的用戶狀態(tài)。

優(yōu)點(diǎn):

  • 敏感數(shù)據(jù)存儲(chǔ)在服務(wù)器端,安全性較高。
  • 減少客戶端的數(shù)據(jù)存儲(chǔ)負(fù)擔(dān)。

缺點(diǎn):服務(wù)器需要維護(hù)大量會(huì)話數(shù)據(jù),可能導(dǎo)致性能瓶頸。

3. 使用 Token(如 JWT)

原理:服務(wù)器在用戶登錄成功后生成一個(gè)令牌(Token),并將 Token 返回給客戶端??蛻舳嗽诤罄m(xù)請(qǐng)求中通過請(qǐng)求頭(如 Authorization: Bearer)攜帶該 Token。服務(wù)器通過驗(yàn)證 Token 的合法性來識(shí)別用戶狀態(tài)。

JWT 示例:

  • Token 格式:Header.Payload.Signature,其中 Payload 包含用戶信息(如用戶 ID、角色等)。
  • 客戶端發(fā)送請(qǐng)求時(shí)攜帶 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…。

優(yōu)點(diǎn):

  • 無需服務(wù)器存儲(chǔ)會(huì)話信息,支持分布式部署。
  • Token 可包含自定義數(shù)據(jù),減少數(shù)據(jù)庫查詢。

缺點(diǎn):

  • Token 較大,增加了每次請(qǐng)求的開銷。
  • Token 一旦簽發(fā),無法輕易撤銷(需引入黑名單機(jī)制)。

4. URL 重寫

原理:將用戶狀態(tài)信息(如會(huì)話 ID)附加到 URL 中,作為請(qǐng)求的一部分傳遞給服務(wù)器。

示例:

  • 服務(wù)器返回的 URL:http://example.com/cart?sessinotallow=12345。
  • 客戶端點(diǎn)擊鏈接時(shí),會(huì)話 ID 隨 URL 發(fā)送到服務(wù)器。

優(yōu)點(diǎn):不依賴 Cookie,適用于禁用 Cookie 的場景。

缺點(diǎn):

  • URL 中暴露狀態(tài)信息,存在安全隱患。
  • URL 長度有限制,不適合存儲(chǔ)復(fù)雜數(shù)據(jù)。

5. 隱藏表單字段

原理:在 HTML 表單中嵌入隱藏字段,用于存儲(chǔ)用戶狀態(tài)信息。當(dāng)用戶提交表單時(shí),這些信息會(huì)隨請(qǐng)求一起發(fā)送到服務(wù)器。

示例:

<input type="hidden" name="sessionId" value="abc123">

優(yōu)點(diǎn):簡單易實(shí)現(xiàn),適合特定場景。

缺點(diǎn):

  • 僅適用于 POST 請(qǐng)求,無法覆蓋所有交互場景。
  • 安全性較低,容易被篡改。

6. 總結(jié)

方法

存儲(chǔ)位置

優(yōu)點(diǎn)

缺點(diǎn)

Cookie

客戶端

簡單易用,支持過期時(shí)間

數(shù)據(jù)可能被篡改,存儲(chǔ)容量有限

Session

服務(wù)器端

安全性高,敏感數(shù)據(jù)不暴露

服務(wù)器存儲(chǔ)壓力大

Token(JWT)

客戶端

支持分布式,無需服務(wù)器存儲(chǔ)

Token 較大,難以撤銷

URL 重寫

URL 中

不依賴 Cookie

存在安全隱患,URL 長度有限

隱藏表單字段

HTML 表單中

實(shí)現(xiàn)簡單

僅適用于特定場景,安全性低

綜上所述,HTTP 協(xié)議雖然本身是無狀態(tài)的,但通過上述機(jī)制(如 Cookie、Session、Token 等)可以有效地保存用戶狀態(tài),滿足不同場景的需求。

三、面試官:能不能具體說一下Cookie的工作原理、生命周期、作用域?使用Cookie存儲(chǔ)會(huì)話信息會(huì)有什么局限?

Cookie是瀏覽器和服務(wù)器之間用于存儲(chǔ)用戶會(huì)話信息的小型文本文件Cookie的工作原理涉及多個(gè)環(huán)節(jié),包括創(chuàng)建、存儲(chǔ)、發(fā)送、更新以及安全措施等。以下是Cookie工作原理的詳細(xì)介紹:

1. Cookie的創(chuàng)建與設(shè)置

當(dāng)用戶首次訪問一個(gè)網(wǎng)站時(shí),服務(wù)器可以通過HTTP響應(yīng)頭中的Set-Cookie指令來創(chuàng)建一個(gè)Cookie。這個(gè)指令包含了Cookie的名稱、值以及一些可選的屬性。

例如:

Set-Cookie: sessinotallow=abc123; Path=/; HttpOnly; Secure; Max-Age=3600

鍵值對(duì):sessinotallow=abc123表示Cookie的名稱是sessionId,值是abc123。

作用域:Path=/表示這個(gè)Cookie在整個(gè)網(wǎng)站的所有路徑下都有效。

安全性:

  • HttpOnly禁止JavaScript訪問這個(gè)Cookie,有助于防止跨站腳本攻擊(XSS)。
  • Secure表示這個(gè)Cookie只能通過HTTPS協(xié)議傳輸,有助于防止中間人攻擊。

生命周期:Max-Age=3600表示這個(gè)Cookie在3600秒(1小時(shí))后過期。

2. Cookie的存儲(chǔ)與管理

瀏覽器會(huì)根據(jù)域名和路徑規(guī)則來存儲(chǔ)Cookie。每個(gè)域名下的Cookie都是獨(dú)立存儲(chǔ)的,例如,example.com的Cookie和other.com的Cookie是分開存儲(chǔ)的。Cookie的作用域由Path屬性決定,例如,Path=/shop的Cookie只在/shop路徑下有效。

瀏覽器還會(huì)根據(jù)Cookie的過期時(shí)間(Max-Age或Expires屬性)來管理Cookie的生命周期。如果Cookie沒有設(shè)置過期時(shí)間,它就是一個(gè)會(huì)話Cookie,會(huì)在瀏覽器關(guān)閉后自動(dòng)刪除。如果設(shè)置了過期時(shí)間,它就是一個(gè)持久性Cookie,會(huì)在指定的時(shí)間后過期。

3. Cookie的自動(dòng)攜帶與使用

當(dāng)用戶再次訪問同一個(gè)網(wǎng)站時(shí),瀏覽器會(huì)自動(dòng)將相關(guān)Cookie附加到HTTP請(qǐng)求頭中,發(fā)送給服務(wù)器。例如:

Cookie: sessinotallow=abc123

服務(wù)器通過解析請(qǐng)求頭中的Cookie信息,可以識(shí)別用戶的身份,從而實(shí)現(xiàn)會(huì)話管理、個(gè)性化服務(wù)等功能。

例如:

  • 會(huì)話管理:服務(wù)器可以通過sessionId來識(shí)別用戶是否已經(jīng)登錄,避免用戶每次訪問都需要重新登錄。
  • 個(gè)性化服務(wù):服務(wù)器可以根據(jù)Cookie中存儲(chǔ)的用戶偏好(如語言、主題等)來提供定制化的內(nèi)容。

4. Cookie的更新與刪除

服務(wù)器可以通過再次發(fā)送Set-Cookie指令來更新Cookie的值或?qū)傩?。例如,服?wù)器可以延長Cookie的有效期,或者修改Cookie的作用域。

要?jiǎng)h除一個(gè)Cookie,服務(wù)器可以發(fā)送一個(gè)同名的Cookie,并將其過期時(shí)間設(shè)置為一個(gè)已經(jīng)過去的時(shí)間。例如:

Set-Cookie: sessinotallow=abc123; Max-Age=0

5. Cookie的安全與限制

盡管Cookie在Web開發(fā)中非常有用,但它也面臨一些安全風(fēng)險(xiǎn):

  • 跨站腳本攻擊(XSS):如果Cookie沒有設(shè)置HttpOnly屬性,惡意腳本可能會(huì)竊取Cookie中的信息。
  • 跨站請(qǐng)求偽造(CSRF):攻擊者可以利用Cookie來偽造用戶的請(qǐng)求。

此外,Cookie還有一些限制:

  • 大小限制:單個(gè)Cookie的大小通常不能超過4KB。
  • 數(shù)量限制:每個(gè)域名下可以存儲(chǔ)的Cookie數(shù)量是有限的。

6. Cookie的替代方案

隨著Web技術(shù)的發(fā)展,Cookie不再是一些場景下的最佳選擇。以下是一些Cookie的替代方案:

  • LocalStorage/SessionStorage:HTML5提供的本地存儲(chǔ)方案,容量更大(通常5-10MB),但僅限于客戶端使用。
  • Token認(rèn)證:使用JWT(JSON Web Token)等令牌來代替Cookie,可以減少服務(wù)器存儲(chǔ)壓力,并提高安全性。

7. 總結(jié)

Cookie通過服務(wù)器創(chuàng)建、瀏覽器存儲(chǔ)與自動(dòng)攜帶的機(jī)制,實(shí)現(xiàn)了用戶狀態(tài)的持久化。它在會(huì)話管理、個(gè)性化服務(wù)等方面發(fā)揮著重要作用,但開發(fā)者也需要注意其安全性和限制,并根據(jù)實(shí)際需求選擇合適的存儲(chǔ)方案。

四、面試官:Session和Cookie的區(qū)別是什么?如果沒有 Cookie 的話 Session 還能用嗎?多服務(wù)器節(jié)點(diǎn)下 Session-Cookie 方案如何做?

1. Session 的工作原理詳解

Session和Cookie類似,也是 Web 開發(fā)中用于跟蹤用戶狀態(tài)的重要機(jī)制,它允許服務(wù)器在多個(gè)請(qǐng)求之間識(shí)別和記住特定的用戶,從而實(shí)現(xiàn)個(gè)性化的用戶體驗(yàn)和安全的用戶認(rèn)證。

以下是 Session 工作原理的詳細(xì)步驟:

(1) Session 的創(chuàng)建

  • 用戶首次訪問:當(dāng)用戶第一次訪問服務(wù)器時(shí),服務(wù)器會(huì)創(chuàng)建一個(gè)新的 Session 對(duì)象。這個(gè)過程通常是由服務(wù)器端的編程語言和框架自動(dòng)完成的,無需開發(fā)者手動(dòng)干預(yù)。
  • 生成 Session ID:服務(wù)器為 Session 對(duì)象分配一個(gè)唯一的標(biāo)識(shí)符,稱為 Session ID。這個(gè) ID 通常是一個(gè)隨機(jī)生成的字符串,用于在后續(xù)的請(qǐng)求中識(shí)別和檢索對(duì)應(yīng)的 Session 對(duì)象。
  • 傳遞 Session ID:服務(wù)器將 Session ID 通過某種方式傳遞給客戶端,通常是將其存儲(chǔ)在用戶的瀏覽器中,例如作為 Cookie 的值或者在 URL 中作為參數(shù)。

(2) Session 的存儲(chǔ)

  • 服務(wù)器端存儲(chǔ):Session 對(duì)象通常存儲(chǔ)在服務(wù)器的內(nèi)存中,但也可以存儲(chǔ)在其他地方,如數(shù)據(jù)庫、文件系統(tǒng)等。存儲(chǔ)方式取決于服務(wù)器的配置和應(yīng)用程序的需求。
  • 內(nèi)存存儲(chǔ):速度快,但服務(wù)器重啟或內(nèi)存不足時(shí)數(shù)據(jù)可能丟失。
  • 數(shù)據(jù)庫存儲(chǔ):持久性強(qiáng),支持 Session 共享和集群化,但速度相對(duì)較慢。
  • 文件系統(tǒng)存儲(chǔ):簡單,但速度較慢,不利于 Session 共享。

(3) Session 的傳遞與使用

  • 客戶端攜帶 Session ID:在用戶的后續(xù)請(qǐng)求中,瀏覽器會(huì)自動(dòng)將 Session ID(通常通過 Cookie 方式)發(fā)送到服務(wù)器。
  • 服務(wù)器驗(yàn)證 Session ID:服務(wù)器根據(jù)客戶端發(fā)送的 Session ID,去查找對(duì)應(yīng)的 Session 對(duì)象。如果找到,服務(wù)器會(huì)加載該用戶的會(huì)話數(shù)據(jù)。
  • 讀寫 Session 數(shù)據(jù):服務(wù)器根據(jù)當(dāng)前請(qǐng)求,讀取或修改該用戶的 Session 數(shù)據(jù),以完成各種業(yè)務(wù)邏輯處理,如保存用戶的登錄狀態(tài)、購物車內(nèi)容等。

(4) Session 的銷毀

  • 會(huì)話結(jié)束:當(dāng)會(huì)話結(jié)束時(shí),服務(wù)器會(huì)銷毀對(duì)應(yīng)的 Session 對(duì)象,釋放占用的資源。會(huì)話結(jié)束的情況包括用戶關(guān)閉瀏覽器、會(huì)話超時(shí)、用戶主動(dòng)注銷等。
  • 超時(shí)設(shè)置:服務(wù)器可以設(shè)置一個(gè)會(huì)話超時(shí)時(shí)間,當(dāng)用戶在一段時(shí)間內(nèi)沒有活動(dòng)時(shí),服務(wù)器會(huì)自動(dòng)銷毀 Session 對(duì)象。
  • 主動(dòng)銷毀:用戶主動(dòng)注銷時(shí),服務(wù)器應(yīng)該銷毀對(duì)應(yīng)的 Session 對(duì)象,以確保用戶的隱私和安全。

2. 網(wǎng)頁源代碼示例(Node.js + Express)

const express = require('express');
const session = require('express-session');
const app = express();


// 配置 Session(存儲(chǔ)于服務(wù)器內(nèi)存,有效期 30 分鐘)
app.use(session({
  secret: 'your-secret-key', // 加密 Session ID 的密鑰
  resave: false, // 是否強(qiáng)制保存未修改的 Session
  saveUninitialized: true, // 是否保存未初始化的 Session
  cookie: { maxAge: 1800000 } // Session ID Cookie 的有效期(30 分鐘)
}));


// 設(shè)置 Session 數(shù)據(jù)
app.get('/login', (req, res) => {
  req.session.user = { id: 123, name: 'Alice' }; // 存儲(chǔ)用戶信息
  res.send('Session 已設(shè)置');
});


// 讀取 Session 數(shù)據(jù)
app.get('/profile', (req, res) => {
  const user = req.session.user; // 讀取用戶信息
  res.send(`歡迎, ${user.name}`);
});


// 銷毀 Session
app.get('/logout', (req, res) => {
  req.session.destroy((err) => {
    if (err) {
      console.error(err);
      res.send('注銷失敗');
    } else {
      res.send('注銷成功');
    }
  });
});


app.listen(3000, () => {
  console.log('服務(wù)器已啟動(dòng),端口 3000 正在監(jiān)聽中...');
});

3. Session和Cookie的關(guān)鍵區(qū)別如下:

特性

Cookie

Session

存儲(chǔ)位置

客戶端(瀏覽器)

服務(wù)器端

有效期

可長期或會(huì)話級(jí)

服務(wù)器配置或用戶行為決定

安全性

較低(客戶端可見)

較高(數(shù)據(jù)存于服務(wù)器)

存儲(chǔ)大小

≤4KB

無固定上限(依賴服務(wù)器資源)

依賴關(guān)系

可獨(dú)立使用

通常依賴 Cookie 存儲(chǔ) Session ID

在多服務(wù)器節(jié)點(diǎn)環(huán)境下,實(shí)施Session-Cookie方案需要解決的核心問題是Session共享與同步,確保用戶在不同服務(wù)器間切換時(shí),會(huì)話狀態(tài)保持一致。以下是具體方案及實(shí)現(xiàn)步驟:

1. Session共享與同步機(jī)制

(1) 粘性會(huì)話(Sticky Session)

原理:通過負(fù)載均衡器(如Nginx)將同一用戶的所有請(qǐng)求固定分配到同一臺(tái)服務(wù)器。

配置示例(Nginx):

upstream backend {
    ip_hash;  # 基于客戶端IP的哈希值分配請(qǐng)求
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;
}

缺點(diǎn):

  • 服務(wù)器負(fù)載可能不均衡。
  • 單臺(tái)服務(wù)器故障會(huì)導(dǎo)致用戶會(huì)話丟失。

(2) Session復(fù)制

原理:服務(wù)器之間實(shí)時(shí)同步Session數(shù)據(jù),確保所有服務(wù)器擁有相同的Session信息。

實(shí)現(xiàn)方式:

  • Tomcat集群配置Cluster節(jié)點(diǎn)和DeltaManager。
  • Spring Session集成Redis等緩存服務(wù)器。

缺點(diǎn):

  • 網(wǎng)絡(luò)帶寬消耗大。
  • 服務(wù)器間耦合度高。

(3) 共享存儲(chǔ)

原理:將Session數(shù)據(jù)存儲(chǔ)在共享存儲(chǔ)中(如數(shù)據(jù)庫、緩存服務(wù)器、文件系統(tǒng)),所有服務(wù)器通過統(tǒng)一接口訪問。

技術(shù)選型:

  • 數(shù)據(jù)庫    MySQL(持久化存儲(chǔ),但性能較低)。
  • 緩存服務(wù)器Redis(高性能,支持過期時(shí)間)。
  • 文件系統(tǒng)NFS(簡單易用,但性能較低)。

2. 具體實(shí)現(xiàn)步驟(以Redis為例)

(1) 技術(shù)選型

  • Redis:作為共享存儲(chǔ),提供高性能的Session讀寫。
  • Spring Boot:集成Spring Session簡化開發(fā)。

(2) 配置步驟

添加依賴:

<!-- Spring Session 依賴 -->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
<!-- Redis 客戶端依賴 -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

Redis配置:

@Configuration
public class RedisConfig {
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379));
    }
}

啟用Spring Session:

@Configuration
@EnableRedisHttpSession
public class SessionConfig {
    // 無需額外配置
}

(3) 代碼示例

存儲(chǔ)Session:

@RestController
public class SessionController {
    @PostMapping("/login")
    public String login(HttpSession session, @RequestParam String username) {
        session.setAttribute("username", username);
        return "登錄成功";
    }
}

讀取Session:

@RestController
public class SessionController {
    @GetMapping("/profile")
    public String profile(HttpSession session) {
        String username = (String) session.getAttribute("username");
        return "歡迎, " + username;
    }
}

4. 總結(jié)

方案

優(yōu)點(diǎn)

缺點(diǎn)

粘性會(huì)話

配置簡單

負(fù)載不均衡,單點(diǎn)故障

Session復(fù)制

實(shí)時(shí)同步

網(wǎng)絡(luò)帶寬消耗大

共享存儲(chǔ)(Redis)

高性能,擴(kuò)展性強(qiáng)

依賴外部存儲(chǔ)

Token替代

無狀態(tài),適合分布式系統(tǒng)

需要處理Token生成與驗(yàn)證

責(zé)任編輯:趙寧寧 來源: 程序員阿沛
相關(guān)推薦

2024-01-10 09:04:46

OSI網(wǎng)絡(luò)模型

2014-06-17 09:30:14

OSI

2019-08-07 07:11:21

OSI七層模型TCPIP五層模型

2013-10-25 09:32:52

OSI七層協(xié)議TCP協(xié)議

2025-04-14 03:45:00

2019-09-30 09:41:04

五層協(xié)議OSITCP

2021-05-18 08:32:33

TCPIP協(xié)議

2019-07-09 13:54:19

網(wǎng)絡(luò)模型網(wǎng)絡(luò)協(xié)議TCP

2019-07-16 10:42:02

網(wǎng)絡(luò)模型TCP

2014-09-03 09:52:15

OSI

2012-11-12 11:26:44

2014-07-24 09:38:34

2024-12-10 07:18:27

2020-09-07 06:28:37

Nginx靜態(tài)負(fù)載均衡動(dòng)態(tài)負(fù)載均衡

2019-06-12 11:01:19

TCPUDPHTTP

2022-06-15 08:01:39

負(fù)載均衡面試OSI

2021-05-14 08:34:32

UDP TCP場景

2019-01-30 10:18:46

七層協(xié)議網(wǎng)絡(luò)通信

2021-08-02 06:49:46

HTTP網(wǎng)絡(luò)模型

2015-07-22 17:33:05

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)