请问控制web用户一个账户同一时间只能在一个地方登陆的问题?不能一个帐号同时登陆两次  我现在的处理方法是通过session 的 两个事件在一个application中的集合中记录,但是这样做有可能卡号,怕用户直接关浏览器而不是去按注销。请问还有没有其他办法??

解决方案 »

  1.   

    可以参考我们教程中的讲解:
    http://family168.com/tutorial/jsp/html/jsp-ch-08.html#jsp-ch-08-02
      

  2.   

    可以在最外层的页面(TOP页面)中加入onunload事件,提交服务器一个通知,接到通知后改变application值,清楚当前session。
    不过用户用F5之类的功能刷新整个页面后需要重新登陆,要完美无缺话是很难的。
      

  3.   

    可以把得到当前用户的IP和session中是否有用户判断
      

  4.   

    public boolean findOnlineUser(HttpServletRequest httpServletRequest,
    String userid) {
    HttpSession session = httpServletRequest.getSession();
    ServletContext application = (ServletContext) session.getServletContext();
    ArrayList users = (ArrayList) application.getAttribute("users");
    HashMap ipUser = (HashMap) application.getAttribute("ipusers"); if (null != users && users.contains(userid)) {
    if(ipUser!=null && ((String)ipUser.get(userid)).equals((String)httpServletRequest.getRemoteAddr())){
    session.setAttribute("username",userid);
    return true ;
    }
    else{
    return false;
    }

    else {
    session.setAttribute("username",userid);
    if(users == null){
    users = new ArrayList();
    }
    users.add(userid);
    if(ipUser == null){
    ipUser = new HashMap();
    }
    ipUser.put(userid,httpServletRequest.getRemoteAddr());
    application.setAttribute("ipusers",ipUser);
    application.setAttribute("users", users);
    return true;
    }
    }
      

  5.   

    将所有在线用户的id存放在application中,当用户登录的时候判断其id是否已经处于登录状态即可
      

  6.   

    利用ServletContext
    给ServletContext定义一个属性,例如"allUsers",
    这个属性的值是一个map<String, String>
    map的key是userId,map的value是用户登录时的sessionId
    每当某个用户登录时,先从ServletContext中取出这个map(第一次要new),
    遍历这个map,遇到相同userId时,取其对应的sessionId(old_sessionId),
    通过request.getRequestSessionId()获得当前sessionId(new_sessionId),
    看这两个sessionId是否相等,
    不相等则添加当前用户的userId,sessionId到map,再set进ServletContext中
    相等则提醒“此帐户已在其他地方登录”
      

  7.   

    定时轮询+IP绑定这样如果用户是直接关闭浏览器,但他若是继续在当前计算机(同一IP)上登录,那是可以的
      

  8.   

    web 中怎样加 定时轮询?
      

  9.   

    可以参考一下jforum2中的做法,本人没仔细研究过。