我想做一个登陆,就是同一时间同一账户,只能一个人登陆,其他人用这个账户登陆 提示对方此账户已登陆。现在遇到一个问题,每次登陆的账户我都放到action一个静态map里面 每次登陆都去验证看登陆了没有,用户退出的时候去map删掉这个用户,但是当对方直接关闭浏览器。或者杀掉进程又或者死机这种非正常退出。我java后台写的监听器是监听不了Session销毁的。求大神指教啊。Javasession

解决方案 »

  1.   

    起个线程,每隔一段时就判断map中的账户是否timeout
      

  2.   

    在js中监听window.onbeforeunload事件,在浏览器关闭时响应,并调用注销登录的action
      

  3.   

    Map<username,sessionId>每次登录的时候都去判断存在不存在 username 不存在就正常登录
    存在的话,检查对应的 session 是否存在, 不存在就正常登录
      

  4.   

    其实这个问题很有难度,对于用session监听器也是不可以完全监听到动作的,所以比较好的做法应该是后来者把前面所登陆的标识给挤出去,这样前个登陆的状态就会失效,后来者的状态是可行的,至于另外的一个做法就是检测是否有前者已经登录,这个作法比较多问题,可能前者登陆突然死机了,那个标识还存在,导致后者不能登入
      

  5.   

    WEB系统一般不会这样做限制。如果遇到#8说的那样,就不科学了。
    如果你还是要现实这样的需求,那就用AJAX,当用户登陆后就每过比如10秒请求一次服务器,进行验证,用户是否在线。在服务器获取最后请求时间,如果超过比如20秒就断定用户已下线就删除SESSION。
    另外介意LZ用WEBQQ的做法,后登陆的可以把先登陆的强制挤下线。
      

  6.   

    用quartz插件做个定时管理,定时请求服务器进行验证用户是否在线
      

  7.   

    你的同时是什么概念?
    是指同一个账号这分这秒这不能同时登录,只要登录时间错开就允许两个相同的账号登录?
    这样应该没什么意义,
    如果是只要这个账号是登录上的状态,再用这账号登录就不能登,
    这样的话用spring-security很好实现我这有个demo
    http://download.csdn.net/detail/zuxianghuang/4295376
      

  8.   

    唯一的办法就是 客户端与服务器端建立长连接。
    如果用户关闭了浏览器,该连接中断,session也会失效。
    如果相同的用户登录,也会给予时时提醒。
    可以参考DWR长连接和FLASH基于UDP协议的长连接。
      

  9.   

    参考IMB系统,如果用户已经登录,弹出提示框,提示继续登录将强制踢出之前的老用户
      

  10.   

    你们说了的很多方法,我都试过了,js那个不稳定 而且是和刷新绑一起的 我写了监听器 不行的,它监听不了非正常退出。用map更不行了 放进去是行,非正常退出的时候怎么去remove?表加字段也一样,非正常退出,怎么去改那个 0 和 1 ??
      

  11.   

    很多人都建议我改成QQ这种挤下线的模式,关键这需求定了别人就要这样做  我最近研究了spring security3.0.2 想用这个做 我还是入门级 谁有没有demo ?
      

  12.   

    试试HttpSessionAttributeListener监听session的方式,网上很多。
      

  13.   

    对于spring security3的你可以看下我博客里那些文章
      

  14.   

    其实spring security3 也不能完全检测到当前账号是否有登录标识,但是它提供的挤掉登录状态的就没问题,如果是配置成检测是否已经登录,有时也会登录不上的
      

  15.   

    给你一段代码吧,同一时间,同一个用户只能一个在线,如果重复登录,提出原先的用户。
    你稍微改改就行了。ServletContext applicationContext = session.getServletContext();
    HttpSession httpSession=(HttpSession)applicationContext.getAttribute(username);
    if(httpSession!=null ){
    applicationContext.removeAttribute(username);
    try{
    httpSession.invalidate();
    }
    catch(Exception e){
    }
    }
    SessionManager.setSessionKeyValue("user", user);
    applicationContext.setAttribute(username, SessionManager.getHttpRequest().getSession());
      

  16.   

    以前做过一个同城交友网站,验证用户在线,是在用户打开一个页面的时候,就向后台发送一个请求,告知用户的当前位置与动态。另外通过cookies保证只有一个页面在一段时间内定时向后台发送在线状态。
     
      

  17.   

    正解啊,当死机,掉电等非正常离线时,判断当前时间减上次最后在线时间,如果小于心跳间隔时间,并且不是同一ip地址登陆的在线用户就像webQQ一样,把之前登陆的用户挤下线