java实现同一账号同一时间只能在一个地方登录(QQ登录效果)

虽然像百度,CSDN等这些网站都没有这样做,当然也没有必要这要这样做。

但是在我们做企业内部应用的时候有时候可能会要求我们这样做(同一账号在统一时间只能在一个登录),最近研究了下现在写出来大家分享下,还望多多的给意见。


我们先定义两个Map对象需要用到,存放用户与HttpSession的关系和sessionId与用户的关系。

一次来记录当前登录的用户是否登录和当前session是否已经绑定了登录用户。

        /**
	 * 用户和Session绑定关系
	 */
	public static final Map<String, HttpSession> USER_SESSION=new HashMap<String, HttpSession>();
	
	/**
	 * seeionId和用户的绑定关系
	 */
	public static final Map<String, String> SESSIONID_USER=new HashMap<String, String>();



然后我们需要实现HttpSessionListener接口监听,主要是监听session的销毁事件。

public void sessionDestroyed(HttpSessionEvent se) {
	String sessionId=se.getSession().getId();
	//当前session销毁时删除当前session绑定的用户信息
	//同时删除当前session绑定用户的HttpSession
	USER_SESSION.remove(SESSIONID_USER.remove(sessionId));
}



接下来可是关键,处理登录用户的唯一。

当用户登录进来的时候我们先把当前HttpSession绑定的用户和用户绑定的HttpSession关系删除。

再次我们删除当前登录的用户绑定的HttpSession关系,如果当前用户已经登录删除session和用户的关系、删除session中用户的信息、设置说明用户被挤下线了。

	/**
	 * 用户登录时的处理
	 * 处理一个账号同时只有一个地方登录的关键
	 * @param request
	 */
	public static void userLoginHandle(HttpServletRequest request){
		//当前登录的用户
		String userName=request.getParameter("userName");
		//当前sessionId
		String sessionId=request.getSession().getId();
		//删除当前sessionId绑定的用户,用户--HttpSession
		USER_SESSION.remove(SESSIONID_USER.remove(sessionId));
		
		//删除当前登录用户绑定的HttpSession
		HttpSession session=USER_SESSION.remove(userName);
		if(session!=null){
			SESSIONID_USER.remove(session.getId());
			session.removeAttribute("userName");
			session.setAttribute("userMsg", "您的账号已经在另一处登录了,你被迫下线!");
		}
	}


用户登录的请求处理。先判断用户输入的登录信息是否合法,在判断用户输入的信息是否正确(登录是否成功),成功则调用单用户登录的处理方法,把当前登录的用户和当前session关联,session中保持当前登录用户的信息

        /**
	 * 用户登录
	 */
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String userName=request.getParameter("userName");
		String password=request.getParameter("password");
		
		if(userName!=null&&!"".equals(userName.trim())){
			//登录成功 
			if(login(userName, password)){
				HttpSession session=request.getSession();
				//处理用户登录(保持同一时间同一账号只能在一处登录)
				 userLoginHandle(request);
				 //添加用户与HttpSession的绑定
				 USER_SESSION.put(userName.trim(), session);
				 //添加sessionId和用户的绑定
				 SESSIONID_USER.put(session.getId(), userName);
				 
				 session.setAttribute("userName", userName);
				 session.removeAttribute("userMsg");
			    }
		}
		response.sendRedirect("index.jsp");
	}
	
	//对比用户输入的信息是否合法,从而判断是否登录成功
	private boolean login(String userName,String password){
             //
          return true;
	}

           个人理解,还望多多给出意见

 


  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值