需要在后台记录登陆情况,登陆时,检测该用户状态,并判断ip,服务端提供一个login检测接口,传入用户信息和ip,检测到已经登陆,就提示

解决方案 »

  1.   

    我记得可以直接通过request获取登录ip和端口的。。
    接下来就只是个登录人和登录状态的比对了
      

  2.   

    全局变量记录登录人信息和IP。如果已经登录,阻止登录,或把已经登录那个人的SESSION给消掉。
      

  3.   

    最近刚开发了一个大概说一下思路:
    要实现这个功能总共要考虑一下几个方面的问题:
    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);

    }
    }