javaweb 禁止账号重复登录,后登录账号踢掉之前登录账号

5 篇文章 0 订阅
4 篇文章 0 订阅

功能目标:

账号在其他地方登录后,当前登录账号被迫下线

步骤:

1、新建两个全局map

//session map,用以实现挤掉相同账号

//key:登录账号;value:session对象

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

//登录用户被挤掉后存放提示消息

//key:sessionIdvalue:提示消息

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

2、登录控制器中创建两个方法

public void repeatOperate(){

         Object uObj = getSession().getAttribute(Environment.GLOBAL_USER_OBJECT);

         if(uObj == null)

                 return;

         User user = (User)uObj;

         HttpSession session = Environment.SESSION_MAP.remove(user.getLogin());

         if(session == null)

                 return;

         Environment.MSG_MAP.put(session.getId(), "账号在其他地方登录,您已被迫下线!");

         logoutSession(session);

    }

   

public void checkUserOnline() {

        JSONObject json = new JSONObject();

        String sessionId = getSession().getId();

        json.put("msg", Environment.MSG_MAP.remove(sessionId));

        response.setContentType("text/html;charset=utf-8");

        try {

                response.getWriter().print(json);

        } catch (IOException e) {

                e.printStackTrace();

        }

}

3、登录控制器的login()方法中添加

登录操作完成后:

repeatOperate();

Environment.SESSION_MAP.put(user.getLogin(), getSession());

4、JS代码

在公共js中添加:

 

var check;

function checkUserOnline(){

        $.ajax({

        type:"POST",

        url:"/checkUserOnlineLogin.action",

        data:{},

        dataType: 'json',

        success: function(data){

        var msg = data.msg;

        if(msg != null && msg != "" && msg != undefined){

                 clearInterval(check);

                 alert(msg);

                 //注销登录

                 logOut();

        }

        }

    });

}

$(document).ready(function(){

        //账号重复登录检查

        check = setInterval("checkUserOnline()",5000);

}

5、新建监听器

package com.regaltec.esa.common.listener;

 

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

 

import com.regaltec.esa.common.cfg.Environment;

import com.regaltec.esa.sys.entity.User;

 

public class SessionListener implements HttpSessionListener{

 

                        @Override

                        public void sessionCreated(HttpSessionEvent arg0) {

                                                // TODO Auto-generated method stub

                        }

 

                        /**

                         * session超时后,删除SESSION_MAP和MSG_MAP中的冗余信息

                         */

                        @Override

                        public void sessionDestroyed(HttpSessionEvent event) {

                                                HttpSession session = event.getSession();

                                                Object o = session.getAttribute(Environment.GLOBAL_USER_OBJECT);

                                                if(o == null)

                                                                        return;

                                                User user = (User)o;

                                                Environment.SESSION_MAP.remove(user.getLogin());

                                                Environment.MSG_MAP.remove(session.getId());

                        }

}

web.xml配置

<listener>

        <listener-class>com.regaltec.esa.common.listener.SpringContextLoaderListener</listener-class>

</listener>

<listener>

        <listener-class>com.regaltec.esa.common.listener.SessionListener</listener-class>

</listener>

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值