当浏览器端,关机,掉线,或者关闭所有页面时,服务器端怎么第一时间知道当前用户已经离线

解决方案 »

  1.   

    Sesson放在Cokie中的何服务器没有关系。。
      

  2.   

    这是http协议关闭浏览器即判断session销毁
      

  3.   

    我的想法是:在User表中定义一个用户是否在线的字段。如果用户登录进来,就把这个字段改为True,如果用户离线就改为False。怎么实现
      

  4.   

    你可以做一个监听。判断 session 是否失效
    失效就修改数据库为false 
      

  5.   

    监听可以,但需要时刻监视session的状态。
    如果人口不是很多就直接放服务器的对象列表里吧
      

  6.   

    这应该有现成监听器或适配器,不用自己写吧,查查API文档就行了
      

  7.   

    并不会立即消失除对应服务器端的session, 有个...BoundListener类(不总用名字忘记了),可以和一个session对应的状态绑定!
      

  8.   

    session不是有个超时时间吗?
    意味着用户如果在这段时间内不作为,就会自动删除该会话。
      

  9.   

    看看这个
    http://topic.csdn.net/t/20050225/08/3804877.html
      

  10.   

    关闭浏览器后,服务器端的session并不会马上清除的,本地也会在cookies保留session信息(如果cookie没有设置关闭浏览器就失效的话),服务器端需要等到session失效后才会清除(session失效时长在web.xml中可配置)。
    不清楚服务器端有没有可监听访客是否关闭浏览器到方法,不过可以考虑一下这个方法:
    在页面上嵌入一个iframe页面,该页面用js控制没间隔1s(时间间隔自己按需设置)向服务端发起一次请求,如果服务端在1min内一直 没收到这个请求的话,可视为用户已经关闭浏览器。
    如果用spring框架的话,ScheduledTimerTask刚好可以实现这个需求。否则自己写监听器。
      

  11.   

    http协议是无状态的链接,这种需求不可能得。另15楼的回答没办法实现,这样对服务器的压力太大,真实项目不可能使用。
      

  12.   

    你要搞清楚http是请求-响应 模式,一次请求-响应完毕之后,连接就断开了。除非再次请求,否则服务器是无法判断用户是否关闭了,是否掉线了等等。服务器是无法主动和浏览器建立连接的。所以除非用户主动注销,或者是session timeout, 没有其他办法,不要异想天开服务器能够知道用户什么时候关闭浏览器。而且作为http服务器,他没有必要随时知道用户的状态。这是由他的功能地位决定的。
      

  13.   

    基于web的聊天室原理就是这样
      

  14.   

    session是服务器给你创建的,并把session的id存在了客户端的cookie中
    当你再次打开浏览器的时候,如果cookie中的sessionId对应的服务器上的session还存在,没有被服务器销毁的话。则默认你还在这次的会话中。
      

  15.   

      -------------------web.xml配置:   
              <filter>   
                      <filter-name>mainfilter</filter-name>   
                      <filter-class>com.chance.MainFilter</filter-class>   
              </filter>   
              <filter-mapping>   
                      <filter-name>mainfilter</filter-name>   
                      <url-pattern>*</url-pattern>   
              </filter-mapping>   
      ------------------MainFilter.java--------------------------   
      package   com.chance;   
      import   javax.servlet.http.HttpServletRequest;   
      import   javax.servlet.http.HttpServletResponse;   
      import   javax.servlet.*;   
      import   java.io.IOException;   
        
      public   class   MainFilter   implements   Filter{   
              public   void   init(FilterConfig   filterConfig)throws   ServletException{   
                      //   
              }   
        
              public   void   doFilter(ServletRequest   request,   
                                                        ServletResponse   response,FilterChain   chain)throws   ServletException,   IOException{   
                      HttpServletRequest   req   =   (HttpServletRequest)request;   
                      HttpServletResponse   res   =   (HttpServletResponse)response;   
                      boolean   isValid=true;   
                      ///////check   attribute   
                      isValid=req.getSession().getAttribute("name")==null;   
                      if(isValid){   
                              req.getSession().getServletContext()   
                                              .getRequestDispatcher("/login.jsp").forward(req, res);   
                      }else   
                              chain.doFilter(request,response);   
              }   
        
              public   void   destroy(){}   
      }