怎么判断同名用户已经登陆,用struts2拦截器可以么?不太会只会判断是否登陆。给个例子最好。。

解决方案 »

  1.   

    是不是可以从session中获取呢?
      

  2.   

    session是打开这个浏览器,如果在其他地方登录呢。
    2台电脑的话呢,就限制不了了吧。
    ……
    在线用户表可以,所有登录成功的用户都存进数据库,每次登录都到表里面遍历查询,
      

  3.   

    该怎么实现呢?用SessionListener呢?还是struts2的拦截器?
      

  4.   

    对了还有个问题,比如已经登陆后,如果点后退就返回到刚才登陆的action请求,可以写个JS来alet一下,然后history.go (-1)。这个JS怎么写?应该是在<form>里onsubmit吧。
      

  5.   

    可以用踢人,就是最后一个登陆的主动剔除上一登陆者。
      用户登陆的时候,把用户的帐号当Key,把产生的sessionID当value保存到全局变量中servletContext.setAttribute(userid,session.getId());   
      然后配置过滤器(当每产生一次新的请求时,程序会先经过过滤器),在过滤器中对本次请求的sessionid进行判断(通过帐号获得保存的sesionid),看是否与全局变量中保存的sessionId一致,如果不一致,表明已经有用此帐户做新的一次登陆(每次登陆时会重新保存sessiondi,因为key(帐号)相同,所以value会被替换),那么上一用户将被强制退出(踢出)。
      

  6.   

    这个有很多做法的,比如session,或者在数据库设计的时候在用户表后面加一个 排他处理的字段,就是当用户登陆这个字段变化,起到保护作用,当有人在此用此用户的时候 ,就有2种做法,一个保护原有的用户,不让再有用户登陆,一个是将原有用户剔除。或者是利用数据库的时间戳timestamp 这个来判断都是一样的
      

  7.   

    具体做法比较简单:    1 登录时,生成一个唯一的标识,然后和用户名关联。 标识保存到session或者cookie里面,用于下次访问。    2 下次访问时,判断标识与用户名关联的是否一样,如果不一样则判断重复登录了,本session自动注销。
    http://blog.csdn.net/java2000_net/article/details/6560509
      

  8.   

    这样的问题在csdn里面已经问过无数次了,我相信论坛里应该有答案其实这个也是非常简单的事情
      

  9.   

    我有一个笨的办法,当用户登录后,在数据库中设个字段状态,0:表示未登录,1:表示已经登录,但是这个你必须保证用户关闭页面的时候到数据库把状态Update过来!
      

  10.   

    这一块我解决的方式是通过Memcached来实现的,具体方法是,在服务器端安装(程序很小可以看做忽略不计)并启动Memcached服务,然后在项目中引入Memcached.jar,在你的登陆校验中写入如下类似的代码,由于示例只是截取主要部分还望楼主能看明白:
    Memcache mc = new Memcache();//创建Memcache对象
    HtglHydainfo hy = (HtglHydainfo) this.qxService.findByHyName(htglHydainfo).get(0);
    //获取当前会员信息对象
    String key = hy.getRyid();//将会员ID作为键
    //判断当前系统中有无以ID为键的数据,如果是null说明当前账号是唯一登陆地点,否则表示该账户已经登陆了
     if (mc.getCache(key) == null) {//如果为null表示当前没有登陆
    mc.setCache(key, ip, Constants.KEEP); // 记住登录状态
     String yyid = hy.getYyid();
    List yycount = this.qxService.findByIdYY(yyid);
    if (yycount.size() > 0) {
    YyYyinfo yy = (YyYyinfo) yycount.get(0);
    request.getSession().setAttribute("yy", yy);
    }
    request.getSession().setAttribute("htglHydainfo",
    hy);
    return "QianTaiDenglu";
    } else {
    response.getWriter().println(
    "<script>alert('该帐号已经登录!');location.replace('"
    + path + "/login1.jsp');</script>");
    }
      

  11.   

    还是要靠自己动手呀!!!虽然用了N长时间现在基本上能做到不让同时登陆了,在每次登陆完,用了两个全局变量存放session.geiId()和username(因为不会用一个存 - -)ServletActionContext.getServletContext().setAttribute("SID", session.getId());
    ServletActionContext.getServletContext().setAttribute("SD", userinfo.getUsername());然后每次登陆判断当前的sessionID和用户名的情况,虽然可以起到了无法重复登陆,但是关闭网页不注销,那么不等到session自己过期就一直无法登陆了!有什么办法可以解决么?
      

  12.   

    你的问题可以根据Session Id 来判断;
      

  13.   

    用 spring security ,能配置
      

  14.   

    这种情况就得靠关闭网页不会消失的数据,比如cookie
      

  15.   


    cookie还有我写的这个还是有BUG的,比如我用别的账号登陆一次,然后重复的账号又能登陆了,因为ServletActionContext.getServletContext().setAttribute("SID", session.getId());
    又被重写了...看来单一靠这种方法还不行,如果写入数据库呢?相应的HQL我又不会写了HQL的单对象Update怎么写呢?能麻烦写一下吗?
      

  16.   

    你这是单态登陆吧,就是类似QQ空间那样,如果这个账号已经登陆了(A),有人那这个账号在另外一台电脑上登陆的时候(B),这是A被踢下线,B上线。是不是这样?
    如果是的话你google java 单态登陆。
    如果没有找到,我说一下思路:
    其实用session监听那个类就可以实现了。A登陆的时候,将这个session放到application中,并指定KEY为该用户名,当B登陆的时候,先取得改用户名在application中查找,如果有则让A的那个session失效,并将B的这个session替换A在application中得session的值,在页面中,使用AJAX定时检查session是否失效。大概就是这样,具体代码你上网查查吧。就搜单态登陆。
      

  17.   

    以前也碰到过这个问题。觉得没必要在数据库创建在线用户列表
    引用 12 楼 yanjinye 的回复:具体做法比较简单:1 登录时,生成一个唯一的标识,然后和用户名关联。 标识保存到session或者cookie里面,用于下次访问。2 下次访问时,判断标识与用户名关联的是否一样,如果不一样则判断重复登录了,本session自动注销。
    http://blog.csdn.net/java2000_net/article/details/6560509
      

  18.   

    好的,谢谢我会去看看,但是现在我这个办法想改进一下,我现在用我的办法结合拦截器,能做到同一个用户名不能重复登陆,保存了sessionID和username到ServletActionContext.getServletContext().setAttribute("SID", session.getId());
    ServletActionContext.getServletContext().setAttribute("SD", userinfo.getUsername());但是假如A用户登陆中,B用户也同时登陆了,那么这个Attribute就保存为B用户的session了,那么第二个A用户就可以登陆了怎么样把sessionID写到表里呢?
      

  19.   


    http://blog.csdn.net/hongfeideng/article/details/7023865 去看看吧。