需要在后台记录登陆情况,登陆时,检测该用户状态,并判断ip,服务端提供一个login检测接口,传入用户信息和ip,检测到已经登陆,就提示
解决方案 »
- 机顶盒死机问题
- 判断那一年是闰年,下面是我写的程序还有那些改进的?谢谢了。
- 更新出现错误
- 如何获取当前WEBLOGIC应用的IP地址及端口信息,感谢!
- 宇宙霹雳无敌超级世界最虚心的请求一个问题....关于日历的..欢迎进来!
- 请问怎样在cmp中实现多表关联查询!
- 我下载了resin3.0.8,不知道javabean的class文件放在哪,请各位高手帮帮忙!!!
- java.lang.NoClassDefFoundError: org/w3c/dom/Element
- 帮忙调试程序(改错)1000分立即想送 分10次揭帖 001
- Linux服务器上Tomcat7.0启动错误
- JAVA SWIING 如何加入图片
- 这个程序为什么出不了结果
接下来就只是个登录人和登录状态的比对了
要实现这个功能总共要考虑一下几个方面的问题:
1、服务器突然断电
2、用户不是正常退出系统
3、不能让另一个用户直接踢出下线,原因是系统无法知道哪一个用户才是真正的真实用户
处理方法;
1、服务器突然断电
由于这个原理咱们可以立马排除掉用数据库实现这一功能的想法,但是java用一个东西能处理这个问题,拿就是static,静态变量,你可以在系统中构造一个静态集合,放用户的登录信息
2、用户不是正常退出系统
这个我当时是这样处理的,就是用户登入系统时提示他没有之前没有退出就行了
3、不能让另一个用户直接踢出下线,原因是系统无法知道哪一个用户才是真正的真实用户
我当时就是用限定用户互踢次数来处理的,就是当两个用户互踢次数达到我设定的次数时,系统将会将该用户的账号直接停用掉
大概处理思路就是这样,至于实现,你可以用filter拦截,也可以用jquery异步的每次去静态集合中获取用户现在的状态,
提供一些我的参数:
userbean.java
/**用户登录IP**/
private String userLoginIp;
/**用户登录时间**/
private String userLoginDate;
/**用户登录标识**/
private String userLoginMark;
/**用户在线状态**/
private int userOnLineStatus;CommonsCheackUser.java
/**
* 检查用户Class
*/
public class CommonsCheackUser {
/**用户在线容器**/
private static Map<String, CommonsUserBean> onlineUser = new HashMap<String, CommonsUserBean>();
/**用户当天互踢容器**/
private static Map<String, Map<String,Integer>> checkingUser = new HashMap<String, Map<String,Integer>>();
/**
* 用户登录成功将该用户添加到在线用户容器中
* @param user
* @param commonsUserBean
*/
public static void addOnLineUserToMap(String user, CommonsUserBean commonsUserBean){
onlineUser.put(user, commonsUserBean);
Map<String, Integer> map = new HashMap<String,Integer>();
map.put(CommonsDateUtils.getDate(new Date(), null),0);
checkingUser.put(user,map);
}
/**
* 更改在线用户属性
* @param user
* @param userMark
* @param userIp
*/
public static Map<String,Object> modifyOnLineUser(String user, String userMark, String userIp, boolean isModifyCheckingUser){
Map<String,Object> rsMap = new HashMap<String, Object>();
onlineUser.get(user).setUserLoginDate(CommonsDateUtils.getDate(new Date(), null));
onlineUser.get(user).setUserLoginIp(userIp);
onlineUser.get(user).setUserLoginMark(userMark);
if(isModifyCheckingUser){
if(checkingUser.get(user).containsKey(CommonsDateUtils.getDate(new Date(), null))){
checkingUser.get(user).put(CommonsDateUtils.getDate(new Date(), null),(checkingUser.get(user).get(CommonsDateUtils.getDate(new Date(), null))+1));
}else{
checkingUser.get(user).put(CommonsDateUtils.getDate(new Date(), null), 1);
}
}
rsMap.put("isSuccess", true);
return rsMap;
}
/**
* 用户退出系统,在容器中修改在线状态为下线
* @param user
*/
public static Map<String,Object> modifyOnLineUserStatus(String user, String userMark, boolean IsSessionFail){
Map<String,Object> rsMap = new HashMap<String, Object>();
if(onlineUser.get(user) != null){
if(userMark.equals(onlineUser.get(user).getUserLoginMark())){
onlineUser.get(user).setUserOnLineStatus(0);
}
if(IsSessionFail){
rsMap.put("IsSessionFail", IsSessionFail);
}else{
rsMap.put("IsSessionFail", IsSessionFail);
}
}else{
rsMap.put("IsSessionFail", true);
}
rsMap.put("isSuccess", true);
return rsMap;
}
/**
* 用户登录时检查用户状态
* @param user
* @return
*/
public static Map<String,Object> loginUserCheck(String user, String userMark, String userIp){
Map<String,Object> rsMap = new HashMap<String, Object>();
if(onlineUser.containsKey(user)){
if(onlineUser.get(user).getUserOnLineStatus() == 0){ if(userIp.equals(onlineUser.get(user).getUserLoginIp())){
rsMap.put("isSuccess", true);
rsMap.put("rsmessage", null);
modifyOnLineUser(user, userMark, userIp, false);
}else{
rsMap.put("isSuccess", false);
rsMap.put("rsmessage", "您上次登录IP("+onlineUser.get(user).getUserLoginIp()+")和本次登录IP("+userIp+")不一样!如不是您本人登录,请修改密码,是否继续登陆?");
modifyOnLineUser(user, userMark, userIp, false);
}
}else{
if(userIp.equals(onlineUser.get(user).getUserLoginIp())){
rsMap.put("isSuccess", false);
rsMap.put("rsmessage", "登录用户在线,可能是没有正常退出或被别人使用,是否继续登录?");
modifyOnLineUser(user, userMark, userIp, true); }else{
rsMap.put("isSuccess", false);
rsMap.put("rsmessage", "您上次登录IP("+onlineUser.get(user).getUserLoginIp()+")和登录时间("+onlineUser.get(user).getUserLoginDate()+")没有按正常步骤退出系统!是否继续登陆?");
modifyOnLineUser(user, userMark, userIp, true);
}
}
}else{
rsMap.put("isSuccess", true);
rsMap.put("rsmessage", null);
addOnLineUserToMap(user,new CommonsUserBean(userIp,CommonsDateUtils.getDate(new Date(), null),userMark,1));
}
return rsMap;
}
/**
* 用户在线时检查用户状态
* @param user
* @return
*/
public static Map<String,Object> onLineUserCheck(String user, String userMark){
Map<String,Object> rsMap = new HashMap<String, Object>();
if(userMark.equals(onlineUser.get(user).getUserLoginMark())){
rsMap.put("isSuccess", true);
rsMap.put("checkingNum", checkingUser.get(user).get(CommonsDateUtils.getDate(new Date(), null)));
rsMap.put("rsmessage", null);
}else{
rsMap.put("isSuccess", false);
rsMap.put("checkingNum", checkingUser.get(user).get(CommonsDateUtils.getDate(new Date(), null)));
rsMap.put("rsmessage", "您的账号已在别处登陆!是否重新登录?");
}
rsMap.put("IsSessionFail", false);
return rsMap;
}
/**
* 当用户被禁用后,重新激活时从用户在线容器中和互踢容器中将该用户移除
* @param user
*/
public static void removeUser(String user){
onlineUser.remove(user);
checkingUser.remove(user);
}
}