zoukankan      html  css  js  c++  java
  • 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态

    最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考。

    换工作心里挺忐忑, 对未来也充满了憧憬与担忧。(虽然已是老人, 换了N次工作了,但每次心里都和忐忑)。

    写写代码反而心里平静了很多。

    入正题,上思路,其实很简单

    一 场景

    用户u1只能在A电脑登录,当在B电脑登录时,A电脑登录状态被取消

    二 思路

    1.创建一个session监听器去监听session属性的创建

    2,用个map储存(如果用户量大可以用KV数据库,如redis之类),K 为用户名, V为session的

    3. 当检测到session的属性 userName添加时,把对应的session中userName属性清空

    三 主要代码

    package com.he.login;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;
    /**
     * 用于监听session属性的添加
     * 
     * @author 何锦彬    QQ 277803242
     *
     */
    public class LoginListener implements HttpSessionAttributeListener {
        // 已经登录用户session
        public static Map<String, HttpSession> loginedUser = new HashMap<String, HttpSession>();
    
        public void attributeAdded(HttpSessionBindingEvent eventAdd) {
            // TODO 监听session属性的添加
            String attrName = eventAdd.getName();
            // 监听到为属性userName的添加
            if ("userName".equals(attrName)) {
                String value = (String) eventAdd.getValue();
                HttpSession session = loginedUser.get(value);
                if (session != null) {
                    session.removeAttribute(attrName);
                }
                loginedUser.put(value, eventAdd.getSession());
            }
    
        }
    
        public void attributeRemoved(HttpSessionBindingEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    
        public void attributeReplaced(HttpSessionBindingEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    
    }

    四,效果

    可以用chrome模拟A电脑, IE模拟B电脑

    第一次用chrome 登录,显示成功,刷新还是成功

    第二次用IE登录,成功

    此时chrome再次刷新,返回登录页面

    整个项目代码地址 

    https://github.com/bensonHe/LoginOnlyOne

    下下来访问

    http://localhost:端口/LoginOnlyOne

  • 相关阅读:
    数据库优化方案之分库分表
    聊聊ThreadLocal源码(基于JDK1.8)
    HashMap扩容死循环问题
    Synchronized偏向锁和轻量级锁的升级
    【Java并发编程之深入理解】Synchronized的使用
    ConcurrentHashMap 1.8为什么要使用CAS+Synchronized取代Segment+ReentrantLock
    面试必备技能:HashMap哪些技术点会被经常问到?
    序列键生成器及单例多例模式
    Effective.Java第1-11条
    抽象工厂(AbstractFactory)模式
  • 原文地址:https://www.cnblogs.com/springsource/p/3558090.html
Copyright © 2011-2022 走看看