sessionListener 实现解决一个账号不同时在线需求。

来源:互联网 发布:2012年网络炒作事件 编辑:程序博客网 时间:2024/06/01 09:40
/** * @Project: 无线定位 * @Title: OnLineOnlyOfUserListener.java * @Package: com.wifi.commons.web.listener * @Description: TODO * @Author: chenxu@sina.cn * @Date: 2015年7月20日 上午10:21:07 * @Copyright: 2015 dreamtech.com.cn Inc. All right reserved * @Version: V1.0 */package com.wifi.commons.web.listener;import java.util.Hashtable;import java.util.Map;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * @Classname: OnLineOnlyOfUserListener * @Description: 用于监听用户账号唯一在线监听(一个账号不能同时在线) * @Author: chenxu@sina.cn * @Date: 2015年7月20日 上午10:21:07 * @Version:V1.0 */public class OnLineOnlyOfUserListener implements HttpSessionListener{        private static final Log log = LogFactory.getLog(OnLineOnlyOfUserListener.class);    /**     * @Title:     * @Description:     */    public OnLineOnlyOfUserListener() {        super();    }    /**     * 线程安全的集合     * Map<userName,SessionObj>     */    private static Map<String, HttpSession> onLine = new Hashtable<String, HttpSession>();        /**     * Session 摧毁时     */    @Override    public void sessionDestroyed(HttpSessionEvent seEvent) {                final String sessionId = seEvent.getSession().getId();        //遍历        for (String key : onLine.keySet()) {                        if (onLine.get(key).getId().equals(sessionId)) {                //log                log.info("账号:"+key+"注销,退出系统。");                //从集合中移除                onLine.remove(key);                            }        }    }        /**     * 登录 线程同步的     * @Methodname: login     * @Discription: TODO     * @return true 登录成功 false 账号已登录     *     */    public synchronized static Boolean login(HttpSession session,String userName,Boolean isCompulsoryLogin){                //获取sessionId        String sessionId = session.getId();                //判断是否存在SessionId是否已经登录其他用户  如登录则移除        for (String key : onLine.keySet()) {            if (onLine.get(key).getId().equals(sessionId)&&key!=userName) {                onLine.remove(key);            }        }        //是否已登录 且不是同一个Session        if (onLine.containsKey(userName)&&!onLine.get(userName).getId().equals(sessionId)) {                        //是否强制登录            if (isCompulsoryLogin!=null&&isCompulsoryLogin) {                                try {                    //摧毁Session                    onLine.get(userName).invalidate();                } catch (IllegalStateException e) {                    log.info(e);                }                                //替换Session                onLine.put(userName, session);                log.info("账号:"+userName+"被强制登录!");                return true;            }                        log.info("账号:"+userName+"已登录!");            //替换Session            return false;        }        //log        log.info("账号:"+userName+"登录成功!");        onLine.put(userName, session);        return true;    }    /**     * Session对象创建时     */    @Override    public void sessionCreated(HttpSessionEvent se) {        // TODO Auto-generated method stub            }        }

0 0
原创粉丝点击