HTTP是面向无连接的服务,即我们可以看作当浏览器向服务器请求了资源并得到了资源或发送完数据(其实请求资源也是发送数据),它们就断开连接了,直到下次需要连接(即接收或发送)时再连接,所以没有显式的动作,我们是不能判断用户是否离线(而事实上用户确实与服务器中断联系),即使是很明显的登录到某个BBS或其他系统也是如此。一般而言,友好的用户会在你所谓的“离线”时发给服务器一个信号,即通常意义的“注销”,这时服务器会把和浏览器中断已久(相对一个连接)的连接重新激活。所以我们不能判断用户的IE是否仍然打开,相反对一个BBS来说,不友好的用户关闭IE后可能并未“离线”。在浏览器和服务器交换数据的过程中,断开是常在的,连接才是偶然的,所以除非用户有明显的动作发生,否则我们是不能判断用户是否离线(这里的离线仅指用户在下次登录前不再以某种身份和服务器发生连接)。

解决方案 »

  1.   

    不过象ASP里的有 SUB APPLICATION_ONEND
    JSP里面有没有类似的方法?
      

  2.   

    有啊。
    jspInit()和jspDestroy()
      

  3.   

    用sessionListener接口(可能拼写有误)当用户绑定session或当用户session结束(也可以是用户非正长退出时只要session超时)就会被它斟听到你可以在绑定session时记录用户,在session失效时注销在线用户记录.
      

  4.   

    同意super_zzw(之支吾) ,可以创建listener类,然后在web.xml中配置listener
      

  5.   

    能不能再详细的阐述一下,session的有效时间的控制!
    还有怎么用session来斟听用户,来计算用户的在线时间(如果session超时了怎么算)!
    谢谢!
      

  6.   

    之支吾和stone你们能不能具体点。
      

  7.   

    class visiter implements HttpSessionBindingListener{
        void onBind(){//好象不是这么叫,忘记了,自己查看
             //添加你的侦听代码
       }
        void deBind(){//好象不是这么叫,忘记了,自己查看
             //添加你的侦听代码
        }
    } 在jsp中:
     visiter v = new visiter();
      session.settimeout(...)//可能拼错了
      session.setAttribute("visit",v);
    这时候绑定事件被触发( onBind() )
    当session超时(比如用户离开1个小时后)deBind()事件被触发.你可以在这两个事件中做你需要的事.比如登记用户,注销当前用户.但是这种做法并不完美,比如在wehsphere中,不支持session超时增听.这时
    你可以做一个后台监视线程,在绑定session时登记用户session , 然后由线程判断session是否超时,如果超时就注销session(session.removeattribute(...)//可能拼错了),这时deBind()会被触发.在tomcat,weblogic,iplanet中都可以使用第一种解决办法.
      

  8.   

    http://expert.csdn.net/Expert/topic/1342/1342697.xml?temp=2.161807E-02
      

  9.   

    HttpSessionListener好像不能对非正常退出的用户监听,例如关闭ie
      

  10.   

    super_zzw(之支吾)的思想完全正确,只是没人给出具体的例子。基本思想就是写一个继承自HttpSessionListener的类,来了就++,走了就--,只不过,这个类需要在站点的jsp配置文件中让服务器监听调用而已,然后在jsp页面中out.print()就OK了。
    下面的程序是我测试通过的:/*SessionCounter.java 类文件*/package SessionCount; import javax.servlet.*; 
    import javax.servlet.http.*; public class SessionCounter implements HttpSessionListener { private static int activeSessions = 0;   //激活的连接数/*进入连接加一*/
    public void sessionCreated(HttpSessionEvent se) { 
    activeSessions++; 

    /*丢失连接减一*/
    public void sessionDestroyed(HttpSessionEvent se) { 
    if(activeSessions > 0) 
    activeSessions--; 

    /*返回当前在线人数*/
    public static int getActiveSessions() { 
    return activeSessions; 

    }/*web.xml配置文件,这个文件应当放在/WEB-INF下面*/<?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/j2ee/dtds/web-app_2.3.dtd">
    <web-app>
    <!-- Listeners -->
    <listener>
    <listener-class> SessionCount.SessionCounter </listener-class>
    </listener>
    </web-app> /*counter.jsp 测试文件*/<jsp:useBean id="sc" class="SessionCount.SessionCounter" />
    <%out.print(sc.getActiveSessions());%>OK,Enjoy everyone!
      

  11.   

    quote-->
    HttpSessionListener好像不能对非正常退出的用户监听,例如关闭ie??
    不能监听还会叫做HttpSessionListener吗?只不过如果用户关闭IE使用这种方法当然不会立刻显示出来,这是因为服务器端的timeout设置问题,到了过期时间后,页面上才会反应出来。
      

  12.   

    "这个类需要在站点的jsp配置文件中让服务器监听调用而已"
    请问叶三秋这个怎么实现。
      

  13.   

    配置web.xml呀,把我上面那三个文件搞定就OK了