牛骨文教育服务平台(让学习变的简单)
博文笔记

使用session监听禁止用户重复登录

创建时间:2016-10-10 投稿人: 浏览次数:137

          在web应用中,常常需要禁止用户重复登录。这里,介绍的方法是通过配置session监听+shiro权限控制框架实现。具体的方法是:

用户登录成功后,将用户信息放入HashMap中,如果存在重复,强制注销之前的session,使之过期。

          1、session 类

package zteict.qinhuangdao.framework.base.utils;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.HashMap;

/**
 * @author: football98
 * @createTime:: 16-6-24
 * @classDescription: 用户单点登录session监听
 */
public class SessionListener implements HttpSessionListener {

    public static HashMap<String,String> userMap = new HashMap<String,String>();

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


    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        HttpSession session = httpSessionEvent.getSession();
        String sessionId = session.getId();
        sessionMap.remove(sessionId);
        for(String key : userMap.keySet()){
            if(userMap.get(key).equals(sessionId)){
                userMap.remove(key);
            }
        }

    }
}
        2、web.xml配置

    <!-- 监听session,实现单点登录 -->
    <listener>
        <listener-class>zteict.qinhuangdao.framework.base.utils.SessionListener</listener-class>
    </listener>

        3、用户登录代码

                //用户登录成功后,更新session Map,如重复登录,强制之前session过期
                String sessionid = SessionListener.userMap.get(username);
                if(sessionid != null&&!sessionid.equals("")){
                    //注销在线用户,如果session id 相同,不销毁。
                    if(!sessionid.equals(request.getSession().getId())){
                        SessionListener.sessionMap.get(sessionid).invalidate();
                        SessionListener.userMap.put(username,request.getSession().getId());
                        SessionListener.sessionMap.put(request.getSession().getId(),request.getSession());
                    }
                }else{
                    if(SessionListener.sessionMap.containsKey(request.getSession().getId())){
                        SessionListener.sessionMap.remove(request.getSession().getId());
                        for(String key : SessionListener.userMap.keySet()){
                            if(SessionListener.userMap.get(key).equals(request.getSession().getId())){
                                SessionListener.userMap.remove(key);
                            }
                        }
                    }
                    SessionListener.userMap.put(username,request.getSession().getId());
                    SessionListener.sessionMap.put(request.getSession().getId(),request.getSession());
                }
           4、在线用户vo类

/**
 * @author: football98
 * @createTime: 16-6-27
 * @classDescription:在线用户vo
 */
public class OnlineVo {
    String loginname;

    public String getLoginname() {
        return loginname;
    }

    public void setLoginname(String loginname) {
        this.loginname = loginname;
    }
}

           5、在线用户查询方法l

/**
     * 查询在线用户信息
     * @return 在线用户信息
     */
    public List<OnlineVo> queryList(){
        HashMap<String,HttpSession> sessionMap = SessionListener.sessionMap;
        List<OnlineVo> list = new ArrayList<OnlineVo>();
        for(String key : SessionListener.userMap.keySet()){
            OnlineVo v = new OnlineVo();
            v.setLoginname(key);
            list.add(v);
        }
        return  list;
    }



声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。