JavaWeb如何實(shí)現(xiàn)限制單個(gè)賬號(hào)多處登錄
在網(wǎng)上有很多解決限制登錄的方法,包括SpringSecurity也有解決的方案,今天記錄一下使用JavaWeb的實(shí)現(xiàn)
知識(shí)點(diǎn)
思路如下:

演示
具體實(shí)現(xiàn):
1.維護(hù)一個(gè)map集合
public class LoginUserMap {
private static Map<String, String> loginUserMap = new ConcurrentHashMap<String, String>();
/**
* set方法
*
* @param loginId 用戶唯一標(biāo)識(shí),用戶名或者用戶Id
* @param sessionId sessionId
*/
public static void setLoginUserMap(String loginId, String sessionId) {
loginUserMap.put(loginId, sessionId);
}
/**
* get方法
*
* @return
*/
public static Map<String, String> getLoginUserMap() {
return loginUserMap;
}
/**
* 根據(jù)sessionId移除map中的值
*
* @param sessionId
*/
public static void removeUser(String sessionId) {
for (Map.Entry<String, String> entry : loginUserMap.entrySet()) {
if (sessionId.equals(entry.getValue())) {
loginUserMap.remove(entry.getKey());
break;
}
}
}
/**
* 判斷用戶是否在map中
*
* @param loginId
* @param sessionId
* @return
*/
public static boolean isInLoginUsers(String loginId, String sessionId) {
return (loginUserMap.containsKey(loginId) && sessionId.equals(loginUserMap.get(loginId)));
}
2.實(shí)現(xiàn)一個(gè)session監(jiān)聽(tīng)
session銷毀能及時(shí)更新map
@WebListener
public class SessionListener implements HttpSessionListener {
private Logger logger=LoggerFactory.getLogger(SessionListener.class);
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
String sessionId = session.getId();
//session銷毀時(shí)消除loginUserMap中的sessionId
LoginUserMap.removeUser(sessionId);
logger.info("session銷毀,sessionId:"+sessionId);
}
}3.定義過(guò)濾器
可自定義一個(gè)過(guò)濾器,但要排除登錄請(qǐng)求(略),核心代碼如下
//判斷是否重復(fù)登錄
String loginName = username.getLoginName();//獲取用戶唯一標(biāo)識(shí)
//判斷當(dāng)前用戶session是否改變
if (!LoginUserMap.isInLoginUsers(loginName,session.getId())) {
//定義自己的實(shí)現(xiàn)方式,被擠下線,我的是:
//session發(fā)送改變,表示別處登錄
//被擠下線,清除session,提示信息,實(shí)現(xiàn)跳轉(zhuǎn)
request.setAttribute("online",false);
request.getRequestDispatcher("/logout.do").forward(request,response);
return;
}
chain.doFilter(new XssHttpSerlet((HttpServletRequest) request), response);4.注冊(cè)監(jiān)聽(tīng)和過(guò)濾器
<filter>
<filter-name>LoginLimitFilter</filter-name>
<filter-class>io.github.brightloong.loginlimite.LoginLimitFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginLimitFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>另外,可以設(shè)置輪詢的方式判斷,讓用戶及時(shí)下線,但消耗資源,我采取的是請(qǐng)求失敗跳轉(zhuǎn)的方式,直接調(diào)用退出登錄的接口
總結(jié)
實(shí)現(xiàn)無(wú)法解決同一瀏覽器多次登錄的問(wèn)題,及sessionId相同,但能實(shí)現(xiàn)基本的限制登錄的操作,因?yàn)樽龅氖翘呔€下,所以相比賬號(hào)在線,無(wú)法登錄來(lái)說(shuō),稍微簡(jiǎn)單,若做第二種形式,則需要考慮session是否消除的問(wèn)題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot配置Https訪問(wèn)的詳細(xì)步驟
HTTP(Hypertext transfer protocal)是一種詳細(xì)規(guī)定了瀏覽器和萬(wàn)維網(wǎng)服務(wù)器之間相互通信的規(guī)則,通過(guò)因特網(wǎng)傳送萬(wàn)維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議,這篇文章主要介紹了SpringBoot配置Https訪問(wèn)的詳細(xì)步驟,需要的朋友可以參考下2024-02-02
org.springframework.dao.OptimisticLockingFailureException樂(lè)觀鎖
本文主要介紹了org.springframework.dao.OptimisticLockingFailureException樂(lè)觀鎖失敗的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
SpringBoot居然有44種應(yīng)用啟動(dòng)器,你都知道嗎
很多人都不知道SpringBoot應(yīng)用啟動(dòng)器竟然有44個(gè),本文就一起來(lái)介紹一下,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
java ThreadLocal線程局部變量常用方法使用場(chǎng)景示例詳解
這篇文章主要介紹了為大家java ThreadLocal線程局部變量常用方法使用場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
springboot的實(shí)體類字段校驗(yàn)的分組校驗(yàn)具體實(shí)現(xiàn)步驟
分組校驗(yàn)允許在不同場(chǎng)景下對(duì)同一實(shí)體類應(yīng)用不同的校驗(yàn)規(guī)則,通過(guò)定義分組接口、在實(shí)體類和Controller中指定分組,以及全局異常處理,可以靈活控制校驗(yàn)規(guī)則,本文介紹springboot的實(shí)體類字段校驗(yàn)的分組校驗(yàn),感興趣的朋友一起看看吧2025-03-03
java基礎(chǔ)之 Arrays.toString()方法詳解
這篇文章主要介紹了java基礎(chǔ)之 Arrays.toString()方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Spring Boot集成starrocks快速入門(mén)Demo(適用場(chǎng)景)
StarRocks 是新一代極速全場(chǎng)景 MPP (Massively Parallel Processing) 數(shù)據(jù)庫(kù),StarRocks 的愿景是能夠讓用戶的數(shù)據(jù)分析變得更加簡(jiǎn)單和敏捷,這篇文章主要介紹了Spring Boot集成starrocks快速入門(mén)Demo,需要的朋友可以參考下2024-08-08

