java做单用户的多重并发会话数限制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java做单用户的多重并发会话数限制相关的知识,希望对你有一定的参考价值。

判定条件很简单,就是在同一时刻,同一帐号仅在一个终端上可正常操作。

我这里用简单的key,value进行判定,将用户存储在map里面,新登录用户登陆进系统后,判断map里是否存在当前用户,若存在就删除,将新登录用户的session信息存入map里,这样前面登录用户就会退出系统。

继承HttpSessionListener,HttpSessionAttributeListener类

1、先需要配置项目下的web.xml

  <listener>

    <listener-class>com.baidu.controller.SessionListener</listener-class>
  </listener>

2、代码贴上

public static Map<String, HttpSession> sessionMap = new HashMap<String, HttpSession>();

private HttpServletRequest request;

public void attributeAdded(HttpSessionBindingEvent event) {
        String name = event.getName();
        if("user".equals(name)){
            User user = (User) event.getValue();
            if (sessionMap.get(user.getUsername()) != null) {  
                HttpSession session = sessionMap.get(user.getUsername());  
                session.removeAttribute(user.getUsername());  
                session.invalidate();  
            }
            sessionMap.put(user.getUsername(), event.getSession());
        }    
}

public void attributeRemoved(HttpSessionBindingEvent event) {
        String name = event.getName(); 
        if (name.equals("user")) {  
            User user = (User) event.getValue();  
            sessionMap.remove(user.getUsername()); 
        }            // TODO Auto-generated method stub   
}

public static Map<String, HttpSession> getSessionMap() {
        return sessionMap;
}
public static void setSessionMap(Map<String, HttpSession> sessionMap) {
  SessionListener.sessionMap = sessionMap;
}

以上基本实现了当前用户顶掉前面登录用户的效果。还是有很多漏洞这种方法,对于简单的实现来说可以将就。
























以上是关于java做单用户的多重并发会话数限制的主要内容,如果未能解决你的问题,请参考以下文章

Shiro 中的并发会话控制

PostgreSQL 每小时最大并发用户会话数

如何设置servlet中并发请求数的限制?

应用程序上的 Spring 最大会话数,而不是应用程序上用户的最大会话数

宽带路由器应用—连接数限制应用举例

为啥数据库经此会话中的活动事务已由另外一个会话提交或终止