web端同一账户同时登陆踢掉前一个登录的用户

       项目要求同一个账户只能在一处登录,如果同时登陆了就把前一个登录的踢掉。

       1.首先在你的controller中定义两个参数

// 用户和Session绑定关系
	public static final Map<String, HttpSession> USR_SESSION = new HashMap<String, HttpSession>();
	// SessionId和用户的绑定关系
	public static final Map<String, String> SESSIONID_USR = new HashMap<String, String>();
因为用户登录成功后,用户的数据是放在Session中保管的,所以要保存session与用户的关系及sessionId与用户的关系。

当用户登录后,我们要把用户数据放到session之前检查一下当前用户是否登录 ps:这步是实现踢掉用户的关键

2.检查当前用户是否登录

/**
	 * 
	 * 用户登录时的处理
	 * 
	 * @param request
	 * 
	 */

	public static void userLoginHandle(HttpServletRequest request) {
		// 当前登录的用户
		String userName = request.getParameter("userName");
		// 当前sessionId
		String sessionId = request.getSession().getId();
		// 删除当前sessionId绑定的用户,用户--HttpSession
		USR_SESSION.remove(SESSIONID_USR.remove(sessionId));
		// 删除当前登录用户绑定的HttpSession
		HttpSession session = USR_SESSION.remove(userName);
		if (session != null) {
			SESSIONID_USR.remove(session.getId());
			session.setAttribute("msg", "您的账号已经在另一处登录了,您被迫下线!");
		}

	}

如果用户已登录,则将用户与session及sessionid与用户关系的两个参数中相关数据通过key的形式清掉,并且向这个session发送消息。


3.前台页面接收消息

由于jsp中获取session不能实时更新,所以我们需要写个定时js方法,不断去获取session的数据

在页面<body>标签添加onload事件绑定checkLogin方法

function checkUserOnline(){
	$.ajax({
        type:"POST",
        url:"/gangcheng/login/checkUserOnline",
        data:{},
        success: function(data){
        	msg = data;
        }
    });
	
	 if(msg=='null'||msg==''|| msg == 'undefined'){
         return;
      }else{
         alert(msg);
    	 提示完信息后,调用你的注销用户方法
      }
}
function checkLogin(){
	 check = setInterval("checkUserOnline()",500);
}
调用的后台方法如下

/**
	 * 判断用户是否同时登陆同一个用户
	 * 
	 * */
	@RequestMapping(value="/checkUserOnline")
	@ResponseBody
	public void checkUserOnline(HttpServletRequest request,HttpServletResponse response) throws IOException{
		HttpSession session=request.getSession();
        PrintWriter out = response.getWriter();
        out.print(session.getAttribute("msg"));
	}

因为我们登录用户的时候做了第二步的操作,所以这边我们调用后台的时候可以取到session中msg的数据,如果有msg则你被别人顶掉了。需要重新登录。

到这里如果没有看懂的话,建议你跟着我的步骤,一步一步copy,完事之后再去自己理解,这个方法有一个缺陷的地方就是同一个浏览器,session是一样的,就会只能记录一个最近登录的用户,前面你登录过的用户就不会再被顶掉了,一般项目是不会有同一个人同时登陆两个用户的情况。如果会有这种情况,那么这种方法不适合你,你需要自己再改动改动

  • 7
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值