1. 程式人生 > >使用session監聽禁止使用者重複登入

使用session監聽禁止使用者重複登入

          在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;
    }