1
可以放到redis 缓存里面维护一个在线用户列表 可以用这个用户id 为key 的一个结构比如sorted set,
在登录的时候或者退出的时候维护这个结构,
设置过期时间 加上超时的时间戳 在集合里面 (结合一些监听sesson对该集合修改 类似方法2)
然后后面有人在用已经登录的用户来登录从缓存里面查到, 就不让他登录。
2.
另一个办法就是就是类似我转的那个文章 将登录信息存到 session里面 ,同时维护一个loginusermap,,map 以sessionID为key vusername 为value ,, 每个用户登录要便利当前map看是否当前vusername已经登录
String sessionId = super.getSessionId(false);
if(loginUserMap==null){
loginUserMap = new HashMap<String, String>();
}
for (String username : loginUserMap.keySet()) {
//判断是否已经保存该登录用户的信息 或者 如果是同一个用户进行重复登录那么允许登录
if(!username.equals(result.getFuUserName()) || loginUserMap.containsValue(sessionId)){
continue;
}
isExist = true;
break;
}
if(isExist){
super.setRequestAttr(Constant.MESSAGE, "抱歉,该用户已登录!");
return "error";
}else {
loginUserMap.put(result.getFuUserName(), sessionId);
} 后面还有监听该session 销毁时候 删掉map对应用户的信息
http://blog.csdn.net/albertfly/article/details/51224218
做法1 2 类似只是一个存到缓存 一个内存里面
redis可以适合分布式部署,第二种内存的话 map要自己写时间 不太好弄 不适合集群环境