`

实现单用户登陆session先进先出(session踢出)

    博客分类:
  • Java
阅读更多

首先在系统增加sessionListener 来监听session 并做并做session保存 创建Class OnlineUserListener implements HttpSessionListener
implements HttpSessionListener  需要实现两个方法:

一个是  sessionCreated  session的创建事件;

一个是sessionDestroyed session的销毁事件;


以下是代码:

public static HashMap sessionMap = new HashMap();
        public void sessionCreated(HttpSessionEvent event) {
                // TODO Auto-generated method stub
                HttpSession session = event.getSession();
                // 初始化当前session
                sessionMap.put(session.getId(), session);
        }

        public void sessionDestroyed(HttpSessionEvent event) {

                HttpSession session = event.getSession();

                // 判断当前session user是否有值
                if (session.getAttribute("user") != null
                                && session.getAttribute("user").toString().length() > 0) {
                        // session销毁清空map 更新map
                        sessionMap.remove(session.getAttribute("user").toString());
                        session.invalidate();
                }
        }

 

需要在web.xml增加监听

<listener>
        <listener-class>com.test.demo.OnlineUserListener</listener-class>
</listener>

 

public static HashMap sessionMap = new HashMap();  全局 静态的map  保存的key=sessionId  value=session  当前的会话ID是一致的所用使用sessionID做key 故可以在我们的action 或servlet 里面 根据当前sessionID 替换为当前用户登录的user 对象 故当前用户登录时,可通过在map中寻找值来判断当前用户是否已在系统中; 一下是单用户登录跟踢出的操作代码:

String username = request.getParameter("username");
                //String password = request.getParameter("password");
                HttpSession session = request.getSession();

                if (OnlineUserListener.sessionMap.get(username.trim()) != null
                                && OnlineUserListener.sessionMap.get(username.trim())
                                                .toString().length() > 0) {
                        // 当前用户已经在线 删除用户
                        HttpSession sessionold = (HttpSession) OnlineUserListener.sessionMap.get(username.trim());
                        // 注销已在线用户session
                        sessionold.invalidate();
                        OnlineUserListener.sessionMap.remove(username.trim());
                        // 清除已在线用户,更新map key 当前用户 value session对象
                        OnlineUserListener.sessionMap.put(username.trim(), session);
                        OnlineUserListener.sessionMap.remove(session.getId());
                } else {
                        // 根据当前sessionid 取session对象。 更新map key=用户名 value=session对象 删除map
                        // key= sessionid
                        OnlineUserListener.sessionMap.get(session.getId());
                        OnlineUserListener.sessionMap.put(username.trim(),OnlineUserListener.sessionMap.get(session.getId()));
                        OnlineUserListener.sessionMap.remove(session.getId());
                }

 

分享到:
评论
2 楼 SpringJava 2013-10-26  
cilendeng 写道
应该用ConcurrentHashMap

,是的,涉及到并发的问题...
1 楼 cilendeng 2012-04-13  
应该用ConcurrentHashMap

相关推荐

Global site tag (gtag.js) - Google Analytics