最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

知識點

思路如下:

演示

具體實現(xiàn):

1.維護(hù)一個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?sleuth?日志跟蹤問題記錄

    springboot?sleuth?日志跟蹤問題記錄

    Spring?Cloud?Sleuth是一個在應(yīng)用中實現(xiàn)日志跟蹤的強有力的工具,使用Sleuth庫可以應(yīng)用于計劃任務(wù)?、多線程服務(wù)或復(fù)雜的Web請求,尤其是在一個由多個服務(wù)組成的系統(tǒng)中,這篇文章主要介紹了springboot?sleuth?日志跟蹤,需要的朋友可以參考下
    2023-07-07
  • 詳解context root修改無效web修改項目路徑(eclipse)

    詳解context root修改無效web修改項目路徑(eclipse)

    這篇文章主要介紹了詳解context root修改無效web修改項目路徑(eclipse)的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java 中 Reference用法詳解

    Java 中 Reference用法詳解

    這篇文章主要介紹了Java 中 Reference用法詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 關(guān)于@Autowired的使用及注意事項

    關(guān)于@Autowired的使用及注意事項

    這篇文章主要介紹了關(guān)于@Autowired的使用及注意事項,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java ant包中的org.apache.tools.zip實現(xiàn)壓縮和解壓縮實例詳解

    java ant包中的org.apache.tools.zip實現(xiàn)壓縮和解壓縮實例詳解

    這篇文章主要介紹了java ant包中的org.apache.tools.zip實現(xiàn)壓縮和解壓縮實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • interrupt()和線程終止方式_動力節(jié)點Java學(xué)院整理

    interrupt()和線程終止方式_動力節(jié)點Java學(xué)院整理

    線程的thread.interrupt()方法是中斷線程,將會設(shè)置該線程的中斷狀態(tài)位,即設(shè)置為true,中斷的結(jié)果線程是死亡、還是等待新的任務(wù)或是繼續(xù)運行至下一步,就取決于這個程序本身
    2017-05-05
  • springboot 使用zookeeper實現(xiàn)分布式隊列的基本步驟

    springboot 使用zookeeper實現(xiàn)分布式隊列的基本步驟

    這篇文章主要介紹了springboot 使用zookeeper實現(xiàn)分布式隊列,通過ZooKeeper的協(xié)調(diào)和同步機制,多個應(yīng)用程序可以共享一個隊列,并按照先進(jìn)先出的順序處理隊列中的消息,需要的朋友可以參考下
    2023-08-08
  • Java字符串編碼解碼性能提升的技巧分享

    Java字符串編碼解碼性能提升的技巧分享

    這篇文章主要是和大家分享幾個Java中提升字符串編碼解碼性能的小技巧,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定的幫助,需要的可以參考一下
    2022-05-05
  • 詳解java線程的開始、暫停、繼續(xù)

    詳解java線程的開始、暫停、繼續(xù)

    本文將介紹通過線程讀取文件內(nèi)容,并且可以控制線程的開始、暫停、繼續(xù),來控制讀文件。具有一定的參考作用,下面跟著小編一起來看下吧
    2017-01-01
  • Java使用OpenOffice將office文件轉(zhuǎn)換為PDF的示例方法

    Java使用OpenOffice將office文件轉(zhuǎn)換為PDF的示例方法

    OpenOffice是一個開源的辦公套件,它包含了文檔處理、電子表格、演示文稿以及繪圖等多種功能,類似于Microsoft Office,本文將給大家介紹Java使用OpenOffice將office文件轉(zhuǎn)換為PDF的示例方法,需要的朋友可以參考下
    2024-09-09

最新評論

鲁甸县| 汉沽区| 雷州市| 广宗县| 南汇区| 柳河县| 古交市| 桂林市| 西青区| 时尚| 永福县| 台南市| 宁夏| 鄂托克旗| 芒康县| 元朗区| 苏尼特左旗| 宽城| 金寨县| 宜兰市| 文登市| 永春县| 定南县| 普兰店市| 文登市| 江油市| 定南县| 大余县| 南汇区| 高尔夫| 渭南市| 林周县| 临邑县| 文昌市| 广水市| 盘山县| 克什克腾旗| 孙吴县| 安西县| 巧家县| 岳池县|