SpringBoot 實現併發登入人數控制

2021-10-06 21:14:45 字數 1827 閱讀 8878

通常系統都會限制同乙個賬號的登入人數,多人登入要麼限制後者登入,要麼踢出前者,spring security 提供了這樣的功能,本文講解一下在沒有使用security的時候如何手動實現這個功能

本文借鑑了

如果你是使用 shiro + session 的模式,可以閱讀此文

demo 技術選型

jwt(token)儲存在redis中,類似 jsessionid-session的關係,使用者登入後每次請求在header中攜帶jwt

如果你是使用session的話,也完全可以借鑑本文的思路,只是**上需要加些改動

兩種實現思路

比較時間戳

維護乙個 username: jwttoken 這樣的乙個 key-value 在reids中, filter邏輯如下

}佇列踢出

// 如果佇列裡的sessionid數超出最大會話數,開始踢人

while

(deque.

size()

> maxsession)

else

try}

catch

(exception e)

}// 如果被踢出了,直接退出,重定向到踢出後的位址

if(currentsession.

iskickout()

)catch

(exception e)

return

false;}

}finally

else

}return

true;}

}比較兩種方法

第一種方法邏輯簡單粗暴, 只維護乙個key-value 不需要使用鎖,非要說缺點的話沒有第二種方法靈活。

第二種方法我很喜歡,**很優雅靈活,但是邏輯相對麻煩一些,而且為了保證執行緒安全地操作佇列,要使用分布式鎖。目前我們專案中使用的是第一種方法演示

執行專案,訪問localhost:8887 demo中沒有儲存使用者資訊,隨意輸入使用者名稱密碼,使用者名稱相同則被踢出

訪問 localhost:8887/index.html 彈出使用者資訊, 代表當前使用者有效

另乙個瀏覽器登入相同使用者名稱,回到第乙個瀏覽器重新整理頁面,提示被踢出

springboot基於token實現登入認證

最近因為專案需求,需採用token的方式實現登入認證,而不再使用session的方式登入,因而採用springboot整合jwt生成token實現登入認證。1.首先新增jwt所需jar包 io.jsonwebtoken groupid jjwt artifactid 0.7.0 version de...

Springboot(三)redis儲存與登入攔截

autowired private stringredistemplate stringredistemplate redis操作類 若存在,將使用者openid存入redis資料庫,並設定過期時間 string token key uuid.randomuuid tostring integer ...

Springboot個人部落格系統 5 後台登入

首先,實現後台登入需要對前端接收的表單資料進行校驗,需要訪問資料庫,所以需要乙個userservice進行資料校驗,呼叫userrepository訪問資料庫,實現如下 userservice service public class userserviceimpl implements users...