java用自定义session管理器解决重复登录问题

在开发一个服务器时,两个用户同时请求信息时,可能会导致许多意想不到的问题,所以我们在服务器端必须控制时刻只有一个客户端处于登录状态,而且当其他客户端登陆时把已登录的客户端踢下线。

我使用的是ssm框架进行开发,当用户登录后在session域中存入该用户的信息,在客户端请求其他数据时通过拦截器判断sessionid对应的session域是否有该用户信息,如果有说明该用户已登录。

在开始解决重复问题时,我在application域中存入用户id对应sessionid,然后每当用户登录时,用session.getSessionContext().getSession()方法获取之前客户端存在服务器的session信息,然后调用invalidate()方法释放掉这个session对象,然后重新把用户id对应新的sessionid存到application域中。但是在测试时总是报错,查资料发现高版本的servlet已经不支持getSessionContext()的getSession()方法了,所以会报错。

于是我写了一个登录管理器,其中包含一个map,map里放入userid对应session域。并在登陆管理器中写了增加登录标签,删除登录标签,查看登录标签的方法。

在新的客户端登录我们可以通过用户id删除对应的登录标签,并释放掉其session对象,这样之前登录的客户端的sessionid就失效了(此处最好向该客户端发送提醒),当该客户端再请求数据时Spring拦截器就会发现它提供的sessionid对应的session域中并没有之前保存的用户信息,就会判定它未登录。

之后再通过增加登录标签把userid对应新客户端的session对象存入登陆管理器的map中,把用户信息存入session对象中,这样就实现了把之前客户端踢下线的功能,保持只有一个客户端处于在线状态。

public class loginManager {

	private static HashMap mymap = new HashMap();

	public static synchronized void AddLoginflag(String userid, HttpSession session) {
		if (session != null && userid != null) {
			mymap.put(userid, session);
		}
	}

	public static synchronized void DelLoginflag(String userid) {
		HttpSession session = (HttpSession) mymap.get(userid);
		if (session != null) {
            //释放session对象,把该键值对从map中移除
			session.invalidate();
			mymap.remove(userid);
		}
	}

	public static synchronized HttpSession getLoginflag(String userid) {
		if (userid == null) {
			return null;
		}
		return (HttpSession) mymap.get(userid);
	}
}

猜你喜欢

转载自blog.csdn.net/yan245294305/article/details/81990520