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

JavaWeb如何實(shí)現(xiàn)限制單個(gè)賬號(hào)多處登錄

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

在網(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)聽

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.定義過濾器

可自定義一個(gè)過濾器,但要排除登錄請(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)聽和過濾器

    <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)無法解決同一瀏覽器多次登錄的問題,及sessionId相同,但能實(shí)現(xiàn)基本的限制登錄的操作,因?yàn)樽龅氖翘呔€下,所以相比賬號(hào)在線,無法登錄來說,稍微簡(jiǎn)單,若做第二種形式,則需要考慮session是否消除的問題。

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

相關(guān)文章

最新評(píng)論

大名县| 铜川市| 句容市| 吉林省| 平顶山市| 新建县| 崇阳县| 绍兴市| 尚志市| 余庆县| 东辽县| 柏乡县| 廉江市| 祁连县| 五常市| 贵阳市| 肃宁县| 嵊州市| 湖口县| 云林县| 新绛县| 三门县| 峨眉山市| 锡林浩特市| 图们市| 乡城县| 望都县| 阿坝县| 吴旗县| 乌鲁木齐县| 鸡泽县| 山阴县| 奇台县| 册亨县| 宜君县| 汝南县| 普兰店市| 宜昌市| 五台县| 大方县| 阜宁县|