java解决web一个账号多用户登陆问题

1、建一个session监听类

public class MySessionListener implements HttpSessionListener {
	public static HashMap sessionMap=new HashMap();


	@Override
	public void sessionCreated(HttpSessionEvent httpSessionEvent) {
		// TODO Auto-generated method stub

	}

	
	@Override
	public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
		// TODO Auto-generated method stub
		
		HttpSession httpSession = httpSessionEvent.getSession();
		Student student = (Student) httpSession.getAttribute("student");
		HttpSession session=httpSessionEvent.getSession();
		DelSession(session);
	}

	public static synchronized void DelSession(HttpSession session) {
		if (session != null) {
			// 删除单一登录中记录的变量
			if(session.getAttribute("student")!=null){
				Student tu =(Student)session.getAttribute("student");
				MySessionListener.sessionMap.remove(tu.getNumber());
			}
		}
	}

}

2.在用户 登录方法 中调用

number是登陆方法获取前端请求的数据(学生登陆的账号)

if (null!=MySessionListener.sessionMap.get(number)){
	System.out.println("此账号已登录!");
	forceLogoutUser(number);
	MySessionListener.sessionMap.put(number,getSession());
}else {
	System.out.println("此账号未登录!");
	MySessionListener.sessionMap.put(number,getSession());
}

3.删除用户在map中存的数据

public static void forceLogoutUser(String uid) {
		// 删除单一登录中记录的变量
		if (MySessionListener.sessionMap.get(uid) != null) {
			HttpSession hs = (HttpSession) MySessionListener.sessionMap.get(uid);
			MySessionListener.sessionMap.remove(uid);
			Enumeration e = hs.getAttributeNames();
			while (e.hasMoreElements()) {
				String sessionName = (String) e.nextElement();
				// 清空session
				hs.removeAttribute(sessionName);
			}
			// hs.invalidate();
		}
	}

4.判断此账号是否已登录

//前端ajax请求代码,会给后一个登陆者进行提示
$.ajax({
                        type: "POST",
                        url: "/student/checkLogin?username=" + username,
                        dataType: "JSON",
                        async: false,
                        success: function (data) {
                            if (data.code == 1) {
                                var flag = confirm("此账号已登录!是否继续登录?")
                                if (flag == false) {
                                    //alert("继续登录成功!")
                                    return;
                                }
                            }
                        }
                    })
//后端java代码,此框架为jfinal
public void checkLogin(){
		String number=getPara("username");//此为jfinal框架的获取前端数据方式

		ObjectVo objectVo=new ObjectVo();//自定义的bean

		if (null!=MySessionListener.sessionMap.get(number)){
			System.out.println("此账号已登录!");
			objectVo.setCode(1);
		}else {
			objectVo.setCode(0);
		}
		renderJson(objectVo);
	}
//ObjectVo
public class ObjectVo {
	
	private Integer code;
	private String msg;
	private Object object;
	
	public Integer getCode() {
		return code;
	}
	public void setCode(Integer code) {
		this.code = code;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public Object getObject() {
		return object;
	}
	public void setObject(Object object) {
		this.object = object;
	}
	
}
给被挤掉的用户进行提示
此方法隔十秒进行一次请求,感觉此方式不太好,如果您有好的解决方法,麻烦请告知一下,谢谢
$(function () {
        setInterval(function () {
            $.ajax({
                type: "post",
                url: "/student/checkIsLogout",
                dataType: "JSON",
                success: function(response){
                    if(response.code == 0){
                        alert("您的账号已在其他地方登录,您被迫下线。")
                        window.location.href="/student/login"
                    }
                }
            })
        },10000)
    })
   /**
	 * 检测账号是否被挤掉
	 */
	public void checkIsLogout(){
		ObjectVo objectVo=new ObjectVo();
		if(getSession()!=null){
			Object student = getSessionAttr("student");
			if (student==null){
				System.out.println("session信息不存在,登录失效");
				objectVo.setCode(0);
			}

		}else{
			System.out.println("session信息不存在,登录失效");
			objectVo.setCode(0);
		}
		renderJson(objectVo);
		return;
	}

参考:https://blog.csdn.net/hk9024/article/details/51836824

Guess you like

Origin blog.csdn.net/weixin_42551369/article/details/100043662