我做单用户登录时(java项目),把用户信息放在session里,并存在一个map里,当用户点击“退出”按钮时,再把map里的值删除,这样出现一个问题,就是用户如果直接关闭浏览器,没办法触发服务器清空session的方法,求做过的大神知道

解决方案 »

  1.   

     
          window.onbeforeunload = function () {            var n = window.event.screenX - window.screenLeft;            var b = n > document.documentElement.scrollWidth - 20;            if (b && window.event.clientY < 0 || window.event.altKey) {                alert("是关闭而非刷新");                window.open(this.location);            } else {                alert("是刷新而非关闭");            } 
            }
    在这里面做处理吧
      

  2.   


    这样不行哦,先假设js能够正确判断刷新和关闭,当用户打开了多个标签页,只关闭其中一个,你就判断用户下线了,然后事实上用户没有下线,只关闭了一个标签页而已。
    再说了,js根本没办法正确判断刷新和关闭,而且要考虑各种浏览器的兼容性。因此个人觉得这不属性js的范畴呢。
      

  3.   


    这样不行哦,先假设js能够正确判断刷新和关闭,当用户打开了多个标签页,只关闭其中一个,你就判断用户下线了,然后事实上用户没有下线,只关闭了一个标签页而已。
    再说了,js根本没办法正确判断刷新和关闭,而且要考虑各种浏览器的兼容性。因此个人觉得这不属性js的范畴呢。你怎么是这么理解的呢, 干嘛要关闭一个选项页就去判断一下用户是否下线,没必要这样,  我上面的代码是这么个意思, 让你捕捉到浏览器直接关闭的事件, 这样你可以在这个事件里面ajax去请求后台,去查表记录,然后决定是更新什么 数据, 不然你用什么 方式获取用户直接关闭浏览器的事件? 又怎么去修改表的状态?  (1)你现在的问题就是 系统里面登录进去后,肯定有个登出按钮,当用户正常登出,你就去修改表的状态.
    (2)如果用户登录系统了,并且打开了多个选项页, 关闭每个选项页时,不要做任何处理,
    (4)如果用户直接关闭浏览器,可以在事件捕捉里面 根据你的要求看要不要去做处理,比如想修改此用户已下线,
    (4)如果用户用多个浏览器登录了,你考虑的太多了,没一个用户这么无聊,如果你要考虑的这么多,那你说咱办?是要清除还是不清除,要清除就清除,不清除就不清除,你根本没办法获取到用户用了哪几个浏览器登录过,没必要在登录之后还记录下你一共有哪几个浏览器登录过,然后还在关闭的时候去判断,你关了这个登录的浏览器,那另外如果有登录的浏览器 那咱办?要不要修改状态,你觉得是不是弄的太复杂了?
      

  4.   

    不能再用户关闭浏览器上座监听,因为这个很多情况下监听不到。
    比如非正常关闭。如果没监听到,那这个用户就永久在线了,这是不允许的。
    支持2楼的做法。但最好有一个timer定时清理过期的用户,如果只在统计的时候清理,而且统计的次数不多的情况下会累积较多的信息,导致处理速度变慢。
      

  5.   

    按照正常情况来说,单用户登录就不会存在 多个浏览器登录的情况了, 登录进去,修改下表的状态为已上线, 其它浏览器再登录时 发现这个状态为已上线,不让再登录就好, 至于同一个浏览器 里面登录的 就不用考虑选项页,只要考虑关闭浏览器,以及正常点击退出按钮 这二个操作就好, 至于是清除cookie还是session 就做相应处理就好,一般好点的是,session+cookie来进行存储的, 因为考虑到session会有丢失的情况。
      

  6.   

    多标签和多浏览器是不同的。
    而现在的大部分浏览器都是标签式(ie6除外),而且标签之间共享资源,比如cookie。
    这个共享,服务器端是没办法检测到的。
      

  7.   


    不知道阁下怎么能判断出直接关闭浏览器的,这个真有难度,或者说没法实现的。阁下的意思是关闭windows意义下的窗口,而不是浏览器内部的tab吧,那么看看这个,打开的都是同一个网站。那么到底用户在关闭哪个的时候下线呢?“刷新非关闭,关闭非刷新”,其实正确判断出很难的,web应用的状态不能依赖这样的前端检测,web应用的用户在线状态是依赖后端语言的session会话机制的。用户恶意退出,这个在技术层面根本检测不到。万一浏览器直接崩溃呢?windows蓝屏?操作系统瘫痪死机?客户机器突然断电?这些都可能导致用户意外退出的,一个onbeforeunload也是无力回天的。
    因此,检测用户退出的动作,这个特别有难度。所以我才举出2#的做法,服务端用定时任务,检测用户在线状态,以辅助用户退出动作的捕获。
    如果用户退出时web应用不需要做出额外的动作,那么完全不用理会这些,Session机制已经解决了这些意外下线的家伙的问题。
      

  8.   


    不知道阁下怎么能判断出直接关闭浏览器的,这个真有难度,或者说没法实现的。阁下的意思是关闭windows意义下的窗口,而不是浏览器内部的tab吧,那么看看这个,打开的都是同一个网站。那么到底用户在关闭哪个的时候下线呢?“刷新非关闭,关闭非刷新”,其实正确判断出很难的,web应用的状态不能依赖这样的前端检测,web应用的用户在线状态是依赖后端语言的session会话机制的。用户恶意退出,这个在技术层面根本检测不到。万一浏览器直接崩溃呢?windows蓝屏?操作系统瘫痪死机?客户机器突然断电?这些都可能导致用户意外退出的,一个onbeforeunload也是无力回天的。
    因此,检测用户退出的动作,这个特别有难度。所以我才举出2#的做法,服务端用定时任务,检测用户在线状态,以辅助用户退出动作的捕获。
    如果用户退出时web应用不需要做出额外的动作,那么完全不用理会这些,Session机制已经解决了这些意外下线的家伙的问题。
    我真服了你, 用户正常的在系统 里面退出 和直接 关闭浏览器用onbeforeunload 捕捉 这种是可以知道的情况就更改下状态, 其它的比如用户直接用任务管理器结束掉,这种根本不用处理,你觉得有必要吗? 我结束到浏览器,下次再打开浏览器 在线,不用登录也很正常, 有cookie或者有session的时候就上线,没有就下线就行了,他这个又不是什么 特殊的需求,需要时时监控的, 至于那个状态说实话意义不是很大,不需要很准确,只是一个标识,没有登录就 登录下,有登录直接打开就好, 你要在服务端时时监控,你自己想下,客户端多了,你对每个都时时监控,你服务不死掉才怪。
      

  9.   

    如果楼主需求是必须得时时监控 那就只能在服务端定时监控,多长时间 没做处理就认为已下线,这种是肯定只能在服务端做操作的, 我只是针对于楼主1楼的提问,认为他是想是不是没办法获取到浏览器直接关闭的事件, 这个是可以捕捉到的,才贴出了onbeforeunload , 至于用任务结束浏览哭,或者直接关电脑这种情况 就不要过于纠结了, 要看他需不需要时时监控,自己取决于 服务端还是客户端。
      

  10.   


    ILove_ASPNET 别激动嘛,伦家楼主说的就是“java 关于单用户登录session问题,在线人数统计,非正常退出系统问题”,所以我才说那些的。还有我只是怀疑onbeforeunload的可靠性而已,没有说思路不行呢。
      

  11.   

    对吧,ILOVE_ASPNET,如果要在线人数统计,就会出问题哦,onbeforeunload如果不可靠,像chrome下,onbeforeunload是没法判断出是直接关了浏览器还是页面跳转的,那么用户非正常离开系统,就没办法正确统计到人数了,系统就一直认为他在线呢?是不是呢?逻辑没错吧。
    表激动哦,就技术论技术而已啦~~~
      

  12.   

    我是这样做的:当一个人在一台电脑上登录了,然后非正常退出。再次登录的时候,判断是不是同一个ip,如果是的话,就让他登录,如果不是,则提示“该用户已登录”。这样做的弊端就是:session超时范围内,只能在一台电脑上登录
      

  13.   

    如果非正常关闭浏览器无法解决,,那么只能通过session监听器来清空你的map了。。
    http://blog.csdn.net/chenghui0317/article/details/9373345