我想做一个判断用户在线的功能,要求一个帐号不能登陆2次,如果已经登陆的帐号在别的地方又登陆则禁止登陆;当一个帐号退出时,马上可以使用此帐号来登陆.一开始我是用session来判断的,可是session过时也有一定的时间啊.
关键是退出这个问题一直解决不了,因为用户有可能直接关闭浏览器.有没有什么办法可以让用户关闭浏览器时,向服务器发送消息呢?
我有试过用onunload,可是没点反应.

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【dber1】截止到2008-07-14 21:15:22的历史汇总数据(不包括此帖):
    发帖的总数量:8                        发帖的总分数:420                      每贴平均分数:52                       
    回帖的总数量:32                       得分贴总数量:16                       回帖的得分率:50%                      
    结贴的总数量:8                        结贴的总分数:420                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!
      

  2.   

    session不行,在数据库记录登录标志,和信息,比如IP,以及sessionId等。一旦发现都不一样,则认定其它地点登录。
      

  3.   

    版主啊,人家说,一旦离线,就允许再次登陆,并没有说离线再次登陆一定要同一ip吧。
    问题是,你不可能判断对方是否在线除非对方登录后,每隔一定时间刷新ie(或者一个小的iframe)
      

  4.   

    在服务器定时检测session是否失效
      

  5.   

    我做过这方面的功能,思路如下:1在页面上写个心跳,也就是每隔多长时间刷新执行后台一个action。2,执行后台时把用户信息存到map里,然后把map把在内存中,也就是static。3后台写一个判断,如果map中的有用户的心跳时音大于规定的时间就说明他关闭页了,然后把他相对应的session删除,如果登出用户名在map中有这个信息就告知同一用户名不能多个同时登陆,如果map中只有一个用户了就写一个定时期检查map。这样通过这个map我们可以做很多想要的判断。
      

  6.   

    要达到很精确的这个似乎太难了,要有一个iframd不断刷新,可是这样的话会比较耗资源,比较卡.
      

  7.   

    带iframe自动刷的网页我一律不开网站一律不去
      

  8.   

    我刚做的项目刚好有这个功能,大概的就是用Cookie取得端末ID,用这个端末ID跟要登陆的ID比较,
    下面是代码,估计看一下大概就知道。    public static int check(String termID, String userCD) {        // 端末IDlogin情報取得
            LoggingUserInfoBean bean = getLoggingUserInfoBean(termID);        // 有取出来之后,与要login的userid进行比较
            if (bean != null) {
                if (!bean.getUserName().equals(userCD)) {
                    return CHK_NG_YOUR_LOGGING;
                }
            }        // 指定userid有没有他人已经登陆在线判断
            Set set = userList.keySet();
            for (Iterator iter = set.iterator(); iter.hasNext();) {
                String term = (String) iter.next();
                LoggingUserInfoBean pbean = (LoggingUserInfoBean) userList.get(term);
                if (pbean.getUserName().equals(userCD) && !pbean.getTerminalID().equals(termID)) {
                    return CHK_NG_ANOTHER_USER_LOGGING;
                }
            }        return CHK_OK;
      

  9.   

       
      建议:
         在数据库里面标明用户是否登陆字段(建议用Int型)
       然后判断是否登陆,一旦登陆,构造新的用户session,销毁以前的session
      

  10.   

    window.onbeforeunload = function()
    {
    }试试这个能用不
      

  11.   

    试试HttpSessionListener,里面可以监听到sessionCreated,sessionDestroyed等事件
      

  12.   

    关闭浏览器session 不是自动消失么? session 完全可以实现阿 你们在说什么啊? 不懂。
      

  13.   

    session只能判断登录用户,未登录的不能识别,建议使用一个filter,一旦有新请求就增加一个用户,根据用户名、IP判断用户是否已经在线,间隔一定时间如果用户没有新的请求就认定为已经离线!只有这个办法比较好
      

  14.   

    在session中加入用户ID,在设置一个服务器启动就加载的守护进程,如下:

    package demo.listener;import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;public class SessionCounter implements HttpSessionListener {
        public void sessionCreated(HttpSessionEvent event) {
            ServletContext ctx = event.getSession( ).getServletContext( );
            Integer numSessions = (Integer) ctx.getAttribute("numSessions");
            if (numSessions == null) {
                numSessions = new Integer(1);
            }
            else {
                int count = numSessions.intValue( );
                numSessions = new Integer(count + 1);
            }
            ctx.setAttribute("numSessions", numSessions);
        }
        public void sessionDestroyed(HttpSessionEvent event) {
            ServletContext ctx = event.getSession( ).getServletContext( );
            Integer numSessions = (Integer) ctx.getAttribute("numSessions");
            if (numSessions == null) {
                numSessions = new Integer(0);
            }
            else {
                int count = numSessions.intValue( );
                numSessions = new Integer(count - 1);
            }
            ctx.setAttribute("numSessions", numSessions);
        }
    }在这个解决方案中,任何一个Session被创建或者销毁时,都会通知SessionCounter 这个类,当然通知的原因是必须在web.xml文件中做相关的配置工作。如下面的配置代码:<?xml version="1.0" encoding="ISO-8859-1" ?>
    <!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
        
    <web-app>
    <display-name>Struts Examples</display-name><listener>
          <listener-class>demo.listener.SessionCounter</listener-class>
    </listener>

    声明:思路是我的,但是代码是在网上引用的
      

  15.   

    楼主思路有问题,应该考虑的是挤掉,而不是考虑禁止,比如我正在一网吧上网,登陆你的系统,突然网吧断电,这是session 还没消失,我倒另外一个网吧登陆,你给我禁止掉,我非了你。
    登陆的时候判断下,该用户名在当前所有的session 会话中是否存在,如果存在就注销掉那个session,新建这个session,
    如果这样不行,可以考虑 简个全局变量,里面存放用户名,与session id,通过session id 来获得对该session的操作
      

  16.   

    关浏览器?监听啊。表里弄个字段专门记录上线与否的,session失效就把该字段update成下线。
      

  17.   

    在数据库中记录日志,记录用户名,如果登录改0---> 1 ,退出 1--> 0查找一个数据库就OK!
      

  18.   

    你可以用记录用户状态的方法.用户未登录则status=0,登录=1, 这样就可以在一个用户登录的时候不让别一个用户登录了,如果对方关闭浏览器你可以用servlet在servlet的disdory方法里(拼写可能不用就是消恢)写把用户的状态改为0
      

  19.   


    System.out.println("支持把它挤掉!");
      

  20.   

    http://heisetoufa.ggblog.com/332131.html
      

  21.   

    有一个简单的办法,用户表加个字段lasttime(最后活动时间),客户端是每隔10分钟提交服务器更新这个时间。当某个用户登录时,判断这个lasttime要小于当前时间10分钟以上,才能登陆。
      

  22.   

    每个页面都引个iframe,iframe用ajax循环发数据,服务器检查,如果服务器没几秒没收到数据,则判定用户已经离线
      

  23.   

    cookiehttp://heisetoufa.ggblog.com/332131.html
      

  24.   

    session listenercreate的时候addUser
    invalidate到时候removeUser
      

  25.   

    session listener 在用户直接关闭窗口的时候无法监听啊
      

  26.   

    这个问题确实没有什么好的解决办法 
    用定时更新数据库某一字段来判断 或者 设置session监听器来监听用户 
      

  27.   

    用session,不過有session超時的問題
      

  28.   

    Session有过时,就用application级别的变量保存
      

  29.   

    1.session 监听
    2.利用Map存放
    3.排挤发
      

  30.   

    session listener 监听session 状态
      

  31.   

    关闭浏览器的动作吧:window.onbeforeunload = function () {
    if (event.clientX > document.body.clientWidth && event.clientY < 0 || event.altKey) {
    window.document.forms[0].submit();//这里执行的是提交退出事件操作
    alert("已关闭!");
    }
    };
      

  32.   

    session的话只能监听到创建session的时候,如果直接关闭浏览器这个确实麻烦啊.
      

  33.   


    无法判断IE叉掉的时间,就无法让用户20分钟内无法登陆。
    IE叉掉要是有事件,这就不是问题了。