使用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;
    }



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值