偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

懵了,如何限制一個(gè)賬號只能在一處登錄......

開發(fā) 前端
以?WebSocket 優(yōu)先,當(dāng) WebSocket 連接異常時(shí),后端回退到 Token 版本校驗(yàn)。這樣既能?保證即時(shí)強(qiáng)制下線,也能?兼容不支持 WebSocket 的場景。

前段時(shí)間有位同學(xué)在面試的過程中被問到了一個(gè)很有意思的問題:【如何限制一個(gè)賬號只能在一處登錄?】,既:單設(shè)備登錄。

PS:很多同學(xué)會把 單設(shè)備登錄 和 單點(diǎn)登錄 搞混,但是他們之間本質(zhì)上是不一樣的。

  • 單設(shè)備登錄:同一賬號 在同一時(shí)間只能在一個(gè)設(shè)備上登錄,如果用戶在另一臺設(shè)備上登錄,則之前的設(shè)備會被自動下線。
  • 單點(diǎn)登錄(SSO):用戶在多個(gè)系統(tǒng)或應(yīng)用之間只需要登錄一次,就可以訪問所有相關(guān)系統(tǒng),無需再次輸入憑據(jù)。

言歸正傳,咱們回到當(dāng)前面試題本身 如何限制一個(gè)賬號只能在一處登錄?

技術(shù)方案

要實(shí)現(xiàn) 單設(shè)備登錄,我們需要設(shè)立一種機(jī)制,確保同一賬號在不同設(shè)備上不能同時(shí)保持活躍。

常見的實(shí)現(xiàn)方式僅從前端角度來說的話,主要有兩種:

1.基于 Token 版本控制(推薦)

核心思想:Token 版本號(token_version)充當(dāng)唯一憑證,每次新設(shè)備登錄時(shí),版本號 +1,舊 Token 失效。

我們來拆解下這個(gè)流程:

首先第一步: 用戶首次登錄

  • 用戶登錄后,數(shù)據(jù)庫中的 token_version 設(shè)為 1。
  • 后端生成 JWT Token,并在 payload 中加入 { userId: 1, tokenVersion: 1 }。
  • 返回 Token 給前端,前端存儲在 localStorage 或 Authorization 頭中。

然后第二步: 用戶在新設(shè)備登錄

  • 新設(shè)備登錄后,后端查詢該用戶的 token_version,然后 +1,更新到數(shù)據(jù)庫(如 token_version=2)。
  • 生成新的 Token { userId: 1, tokenVersion: 2 },返回給新設(shè)備。

第三步: 舊設(shè)備攜帶 Token 訪問接口

  • 舊設(shè)備的 Token 仍然是 { userId: 1, tokenVersion: 1 },但數(shù)據(jù)庫中 token_version=2。
  • 服務(wù)器驗(yàn)證 Token,發(fā)現(xiàn) tokenVersion !== 數(shù)據(jù)庫的 token_version,返回 401,拒絕訪問。

第四步: 舊設(shè)備強(qiáng)制下線

  • 舊設(shè)備前端收到 401 響應(yīng)后:
  • 清除本地 Token
  • 跳轉(zhuǎn)到登錄頁
  • 提示 "賬號已在其他設(shè)備登錄,請重新登錄"

以上方案是實(shí)現(xiàn) 單設(shè)備登錄 最簡單的方案,核心就是維護(hù)了 token_version 的版本值

2.基于 WebSocket 的實(shí)時(shí)強(qiáng)制下線

核心思想:每次用戶在新設(shè)備登錄時(shí),服務(wù)器通過 WebSocket 通知舊設(shè)備下線,舊設(shè)備收到消息后清除 Token 并強(qiáng)制登出。

咱們通常拆解下這個(gè)流程:

首先第一步: 用戶首次登錄

  • 用戶登錄后,服務(wù)器建立 WebSocket 連接,并在 Redis 或者 數(shù)據(jù)庫中存儲對應(yīng)狀態(tài),如: { userId: 1, socketId: "xyz123" } 以記錄該設(shè)備的 WebSocket 連接 ID。

然后第二步:用戶在新設(shè)備登錄

  • 新設(shè)備登錄后,服務(wù)器檢測到該用戶已有活躍連接。
  • 給舊設(shè)備發(fā)送 WebSocket 消息:"你的賬號已在其他設(shè)備登錄,請重新登錄"
  • 刪除舊設(shè)備的 WebSocket 連接記錄
  • 新設(shè)備建立 WebSocket 連接,存儲 { userId: 1, socketId: "abc456" }

第三步:舊設(shè)備收到 WebSocket 消息

  • 舊設(shè)備監(jiān)聽到 "被踢下線" 消息:
  • 清除本地 Token
  • 自動跳轉(zhuǎn)到登錄頁
  • 提示 "賬號已在其他設(shè)備登錄"

與上一個(gè)相比,這里核心就是利用了 WebSocket 雙向通訊 的能力來實(shí)現(xiàn) 強(qiáng)制下線 的功能,好處是可以做到 即時(shí)響應(yīng)。麻煩的地方是需要重新對接 ws 協(xié)議。

我們可以通過以下表格來對比下兩種方案的差異:

方案

優(yōu)勢

劣勢

基于 Token 版本控制

邏輯簡單,后端維護(hù) Token 版本即可,兼容性好

需要前端主動處理 401,可能有短暫的延遲

基于 WebSocket 實(shí)時(shí)強(qiáng)制下線

即時(shí)性強(qiáng),用戶體驗(yàn)更好

需要 WebSocket 連接,維護(hù)連接狀態(tài),斷連時(shí)需要額外處理

當(dāng)然,這兩種方案也可以結(jié)合起來進(jìn)行使用:

以 WebSocket 優(yōu)先,當(dāng) WebSocket 連接異常時(shí),后端回退到 Token 版本校驗(yàn)。這樣既能 保證即時(shí)強(qiáng)制下線,也能 兼容不支持 WebSocket 的場景。

責(zé)任編輯:武曉燕 來源: 程序員Sunday
相關(guān)推薦

2025-03-12 08:00:00

單點(diǎn)登錄單設(shè)備登錄程序

2024-11-11 14:57:56

JWTSession微服務(wù)

2021-12-09 11:31:16

跨域后端開發(fā)

2022-05-31 08:35:05

RocketMQACK客戶端

2024-11-08 15:09:59

2021-07-14 15:06:50

SDK版本 jar

2025-02-13 00:34:22

Spring對象系統(tǒng)

2009-06-06 09:07:05

微軟蓋茨莊園

2021-04-21 08:54:49

Go語言程序

2019-10-09 13:39:39

Python編程語言異常錯(cuò)誤

2024-08-09 08:25:32

Spring流程注解

2017-05-11 08:46:35

全閃存數(shù)據(jù)中心容量

2014-08-21 14:49:32

MIUI 6

2023-12-28 10:37:16

散彈式更新管理

2019-05-23 09:30:22

網(wǎng)絡(luò)框架數(shù)據(jù)

2018-04-27 14:18:01

2010-11-19 17:11:48

RG-SSO組件五位一體銳捷網(wǎng)絡(luò)

2023-12-05 14:10:00

接口可讀性
點(diǎn)贊
收藏

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