欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaWeb如何實現(xiàn)限制單個賬號多處登錄

 更新時間:2024年08月13日 14:33:09   作者:咕嚕咕嚕da  
這篇文章主要介紹了JavaWeb如何實現(xiàn)限制單個賬號多處登錄問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

在網(wǎng)上有很多解決限制登錄的方法,包括SpringSecurity也有解決的方案,今天記錄一下使用JavaWeb的實現(xiàn)

知識點

思路如下:

演示

具體實現(xiàn):

1.維護一個map集合

public class LoginUserMap {
    private static Map<String, String> loginUserMap = new ConcurrentHashMap<String, String>();
    /**
     * set方法
     *
     * @param loginId   用戶唯一標(biāo)識,用戶名或者用戶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.實現(xiàn)一個session監(jiān)聽

session銷毀能及時更新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銷毀時消除loginUserMap中的sessionId
        LoginUserMap.removeUser(sessionId);
        logger.info("session銷毀,sessionId:"+sessionId);
    }
}

3.定義過濾器

可自定義一個過濾器,但要排除登錄請求(略),核心代碼如下

 				//判斷是否重復(fù)登錄
                String loginName = username.getLoginName();//獲取用戶唯一標(biāo)識
                //判斷當(dāng)前用戶session是否改變
                if (!LoginUserMap.isInLoginUsers(loginName,session.getId())) {
                     //定義自己的實現(xiàn)方式,被擠下線,我的是:
                    //session發(fā)送改變,表示別處登錄
                    //被擠下線,清除session,提示信息,實現(xiàn)跳轉(zhuǎn)
                    request.setAttribute("online",false);
                    request.getRequestDispatcher("/logout.do").forward(request,response);
                    return;
                }
                chain.doFilter(new XssHttpSerlet((HttpServletRequest) request), response);

4.注冊監(jiān)聽和過濾器

    <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è)置輪詢的方式判斷,讓用戶及時下線,但消耗資源,我采取的是請求失敗跳轉(zhuǎn)的方式,直接調(diào)用退出登錄的接口

總結(jié)

實現(xiàn)無法解決同一瀏覽器多次登錄的問題,及sessionId相同,但能實現(xiàn)基本的限制登錄的操作,因為做的是踢線下,所以相比賬號在線,無法登錄來說,稍微簡單,若做第二種形式,則需要考慮session是否消除的問題。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot配置Https訪問的詳細步驟

    SpringBoot配置Https訪問的詳細步驟

    HTTP(Hypertext transfer protocal)是一種詳細規(guī)定了瀏覽器和萬維網(wǎng)服務(wù)器之間相互通信的規(guī)則,通過因特網(wǎng)傳送萬維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議,這篇文章主要介紹了SpringBoot配置Https訪問的詳細步驟,需要的朋友可以參考下
    2024-02-02
  • org.springframework.dao.OptimisticLockingFailureException樂觀鎖失敗的解決方法

    org.springframework.dao.OptimisticLockingFailureException樂觀鎖

    本文主要介紹了org.springframework.dao.OptimisticLockingFailureException樂觀鎖失敗的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • SpringBoot居然有44種應(yīng)用啟動器,你都知道嗎

    SpringBoot居然有44種應(yīng)用啟動器,你都知道嗎

    很多人都不知道SpringBoot應(yīng)用啟動器竟然有44個,本文就一起來介紹一下,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-01-01
  • java ThreadLocal線程局部變量常用方法使用場景示例詳解

    java ThreadLocal線程局部變量常用方法使用場景示例詳解

    這篇文章主要介紹了為大家java ThreadLocal線程局部變量常用方法使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 封裝jndi操作ldap服務(wù)器的工具類

    封裝jndi操作ldap服務(wù)器的工具類

    這篇文章主要介紹了封裝JNDI操作LDAP服務(wù)器的工具類,使用者只需要會使用List,Map 數(shù)據(jù)結(jié)構(gòu),大家參考使用吧
    2014-01-01
  • Jackson自定義序列化與反序列化注解詳解

    Jackson自定義序列化與反序列化注解詳解

    這篇文章主要介紹了Jackson自定義序列化與反序列化注解詳解,某些場景下,我們使用Jackson對數(shù)據(jù)進行序列化或反序列化的時候,需要對某些數(shù)據(jù)進行特殊處理,需要的朋友可以參考下
    2023-11-11
  • springboot的實體類字段校驗的分組校驗具體實現(xiàn)步驟

    springboot的實體類字段校驗的分組校驗具體實現(xiàn)步驟

    分組校驗允許在不同場景下對同一實體類應(yīng)用不同的校驗規(guī)則,通過定義分組接口、在實體類和Controller中指定分組,以及全局異常處理,可以靈活控制校驗規(guī)則,本文介紹springboot的實體類字段校驗的分組校驗,感興趣的朋友一起看看吧
    2025-03-03
  • 一文詳解Spring如何控制Bean注入的順序

    一文詳解Spring如何控制Bean注入的順序

    這篇文章主要為大家詳細介紹Spring如何控制Bean注入的順序,其中續(xù)注意的是在Bean上加@Order(xxx)是無法控制bean注入的順序的,需要的可以參考一下
    2022-06-06
  • java基礎(chǔ)之 Arrays.toString()方法詳解

    java基礎(chǔ)之 Arrays.toString()方法詳解

    這篇文章主要介紹了java基礎(chǔ)之 Arrays.toString()方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Spring Boot集成starrocks快速入門Demo(適用場景)

    Spring Boot集成starrocks快速入門Demo(適用場景)

    StarRocks 是新一代極速全場景 MPP (Massively Parallel Processing) 數(shù)據(jù)庫,StarRocks 的愿景是能夠讓用戶的數(shù)據(jù)分析變得更加簡單和敏捷,這篇文章主要介紹了Spring Boot集成starrocks快速入門Demo,需要的朋友可以參考下
    2024-08-08

最新評論