对于用户登录,我想做像做到不能重复登录,网上说放在session中,那两台机器呢?还有的说放在application中,那访问的人数达到一定的数量呢?岂不悲剧了!嗯,我想在数据库里弄一个字段,online,0代表下线,1代表上线,但如果用户没有按照流程正常退出,而是直接关掉浏览器或是断电、死机等意外发生,怎么实现一个监听对其数据库中的数据进行更改。
   望各位大神各点实际的提示!由衷感谢!

解决方案 »

  1.   

    对于用户登录,我想做像做到不能重复登录,网上说放在session中,那两台机器呢?
    用session好,对于单纯的用户登录,不可能用到application.对于你所说的两台机器,每个用户的session都不同,所以不用担心,如果相同,可以向qq那样的实现操作一样了
      

  2.   

    如果一定要获得登录退出状态,就需要除了登录退出来确认在线下线外,还得有一个 在线确认+超时认定下线 机制如果没有在线确认(比如心跳消息等),就无法确认是否没有主动退出,结合了超时认定下线就可以完善退出机制。具体的可以查一下:
    2、session何时被删除 
    综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)http://beyond99.blog.51cto.com/1469451/543282
      

  3.   

    可能一楼没有听明白我的意思,我是想让一个用户不能多次登录,只能登录一次,如果不下线另一台机器上是不能登录同一个账号的,session不能跨机器。
      

  4.   

    用数据库中的 0,1来区分也可以。。但不是简单的按照退出来区分是否退出 。。应该每个客户端登陆成功后就要和服务器端连接一个TCP长连接。每隔1分钟都要发送一个通道保持信号 如果3分钟内服务器端没有收到相应客户端发送的通道保持信号 服务器端就认为该用户已经推出 这个时候服务器端自动修改该用户的数据库状态。。
      

  5.   

    map ConcurrentHashMap<userId,userSession>
     if(map.get("xxx")!=null)
        不能登陆
     else
       map.put("xxx",userSession)
      

  6.   

    存在数据库比application更杯具。
    用户的每一次访问你都要去数据库查询并验证?
    比较好的做法是存在application或是static一个map。
    一般是后登陆的踢掉先登陆的。因为你根据无法准确地知道客户端什么时候下线了(比如死机、或断电)。不过用长连接可以解决这个问题,但从技术上来说要麻烦一些。
      

  7.   

    session覆盖就可以了,map存个用户名和session ID sessionID 是唯一的,那样覆盖别人session别人就自动被T了,不要什么监听的。你设置online的话如果IE非正常关闭的话数据永远不会变0或1的话用户怎么上线了?
      

  8.   

    非正常关闭session会失效的,可以以此来更新数据!
      

  9.   

    http://dtfy56924.iteye.com/blog/545355单点登录sso
      

  10.   


    这个等待时间多长?你设置session多长?一分种?那我操作时稍微延迟一点就自动退出了,十分钟?那我非正常退出是不是要等十分钟才能再次登陆?所以还是用踢的方式比较好,QQ也是用的踢的方式嘛。