我需要解决的问题是:
    为了防止多人登陆,我在数据库表中设置了一个字段online,问题出来了,用户退出时的session问题和online字段修改问题
    1:如果用户正常退出,这种情况是可行的,session当然销毁了。
    2:用户关闭网页窗口或是关闭选项卡组(即关闭了浏览器),或是刷新时,我用的是onunload的方法,但是三者处理的不好,往往一个行一个就不行了,在IE7中用window.event.clientY<0 || window.event.altKey,当开了多个选项卡时,再关闭浏览器,就不会触发该条件下的语句,而是跟刷新一样的效果了???????这个怎么解决啊。。求帮助
          多谢大家啦!!!!!!!

解决方案 »

  1.   

    我的意思是:
        用这个js
          function close(){ 
    if(document.body.clientWidth-event.clientX< 170&&event.clientY< 0||event.altKey) 

       alert("执行");}  else{
        alert("刷新或离开");
    }
    }
    在<body onunload="close()">
    在IE7里,  如果有两个以上的选项卡一起开着,然后关闭浏览器,想要得到“执行”提示,而不是“刷新或离开”
      

  2.   

    浏览器发心跳给服务器端, 用ajax可以实现. 
    没心跳了就销毁session.
    但是如果人数多了, 服务器能否承受住, 这个可得好好考虑下.
      

  3.   

    如果单纯是防止用户重复登录的话, 不用弄得这么麻烦, 将online字段改为sessionID 就可以了, 每当用户登录时,就将用户表中的sessionID字段更新为最后一次登录的sessionID, 再建一个过滤器, 在过滤器中判断当前 session 的 seesionID 和 session 中存储的 userId 是否与数据库中的匹配,如果不匹配则提示“已在其他地方登录”(如果用户不是很多的话,可以考虑将其放在一个静态的map中)。
      

  4.   

    多谢两位给的建议,这个我会去考虑,现在没有解决的问题就是:假如用onunload来触发ajax,如果什么条件都不给,那么IE7浏览器会在刷新,关闭浏览器时触发,但是为了不再刷新时候出发,我用了if(document.body.clientWidth-event.clientX < 170&&event.clientY < 0||event.altKey)语句来判断,这样确实可以再刷新时候不触发,但是,如果在IE7里开了多个选项卡,再同时关闭浏览器(右上角那个叉叉),效果出来就会跟刷新一样,我正在为这个郁闷,希望在那种情况下,执行上面条件里边的Ajax语句,希望大家再给点意见,或是补充那个条件。
        在下感谢大家啦!!!!!!!
      

  5.   

    楼主可以给一个时间戳,浏览器刷新时间戳肯定不同,所以把它与先前的时间戳对比不一样就可以了
    而关闭浏览器时没有刷新时间戳就不会改变,判断一下就行了..
    另外:
    (document.body.clientWidth-event.clientX < 170&&event.clientY < 0||event.altKey)
    这样的语句要少用
      

  6.   

    你用的asp还是其他,如果是asp的话可以自global.asa文件中session事件中写程序,
    在会话结束的实际中添加销毁session变量的程序即可,如下:
    sub Application_OnStart
      'some code
    end subsub Application_OnEnd
      'some code
    end subsub Session_OnStart
      'some code
    end subsub Session_OnEnd
      'some code
      '在此处添加销session变量的程序即可
    end sub
      

  7.   

    多谢两位的意见和提示,对于时间戳,我不怎么清楚,你能具体讲一下或者给我给案例什么的。[email protected] 我的邮箱   谢谢
      

  8.   

    -.- 非正常关机或者浏览器异常都不会触发onunloadsession非正常销毁是靠超时机制的,好像PHP, ASP, .NET , JSP 都有很成熟的解决方案的。 靠unload搞是自寻死路。
      

  9.   

    。 如果要是单纯的刷新的时候不执行unload里面的一些内容的话还是很简单的
    var flat=0;
    document.body.onkeydown=function(){
    if(event.keyCode==116){
    flat=1;
    }
    };
    document.body.onunload=function(){
    if(flat==1){
    return false;
    }
    return confirm("你确定");
    };
    类似代码就可以了
    (document.body.clientWidth-event.clientX < 170&&event.clientY < 0||event.altKey)
    这句代码太牛逼了
      

  10.   

      草。。 上面的代码我都没测试 ,一试之下果然有bug 
    又想了一个 这个用ie8测试了,肯定可以,没试过别的浏览器
    document.body.onkeydown=function(){
    if(event.keyCode==116){
    document.body.onbeforeunload=null;
    }
    }
    document.body.onkeyup=function(){
    if(event.keyCode==116){
    document.body.onbeforeunload=function(){
    return '你确定离开';
    };
    }
    }
    document.body.onbeforeunload=function(){
    return "你确定离开";
    }
    原来onbeforeunload和onunload是不同的, 不就是个关闭事件吗, 搞这么多名堂