写一个单例类,每当有人登陆时将总人数加1,每当登出时总数减1。
public class AccountSingle {
  private static AccountSingle account =new AccountSingle();
  private int total=0;
  
  private AccountSingle(){}
  /**取得唯一实例对象*/
  public static AccountSingle getInstance(){
    return account ;
  }
  /**登入操作,总数加1,要同步*/
  public synchronized void loginAction(){
    total+=1;
  }
  /**登出操作,总数减1,要同步*/
  public synchronized void logoutAction(){
    total-=1;
  }
  
  public int getTotal(){
    return total;
  }
}这个类可以在登入/登出时候使用。
登入代码中加入一行:AccountSingle.getInstance().loginAction();
登出操作雷同。
这是比较简单的方法,你还可以在单例中增加一个hashtable来保存每个再线用户的信息。
你可能要问:有好多人退出系统前直接关闭页面,并不点你的登出按钮,这个问题可以通过
js来做。在页面body标签中作个声明: unload="logout()"  (是不是unload属性我忘了)
在你的logout()函数里面执行登出的操作流程。
如果你觉得这样不安全,可以写一个监听线程来监听session,这样比较麻烦,我就不写了。

解决方案 »

  1.   

    可以写一个监听线程来监听session,这样才 是最好的吧 。。
      

  2.   

    wwwer1(武陵豪杰) 兄弟的解答可能行不通,因为没有考虑用户不登录和不登出的情况,而这两种情况也会造成在线人数的变化通常一个系统的在线人数的精确统计要考虑用户以匿名身份浏览的情况,也要考虑session失效的情况。过去使用监听来操作session,会使用HttpSessionBindingListener ,现在新的servlet2.3 or later支持HttpSessionListener ,其功能更加丰富,但后者需要在web.xml中配置filter参数,而前者不需要提前注册,下面有个HttpSessionBindingListener 的具体应用,你可以参考一下,关于更为详细的说明可以参考servlet的API文档:*******************彻底搞定JSP在线人数 
    **这是管理user信息的类 文件名为onLineUser.java 欢迎访问javajia家(http://www.javajia.com),由yuking制作。2001.1.1 
    */ import javax.servlet.http.*; 
    import javax.servlet.*; 
    import java.util.*; public class onLineUser implements HttpSessionBindingListener { 
    public onLineUser(){ 
    } private Vector users=new Vector(); 
    public int getCount(){ 
    users.trimToSize(); 
    return users.capacity(); 

    public boolean existUser(String userName){ 
    users.trimToSize(); 
    boolean existUser=false; 
    for (int i=0;i<users.capacity();i++ ) 

    if (userName.equals((String)users.get(i))) 

    existUser=true; 
    break; 


    return existUser; 
    } public boolean deleteUser(String userName) { 
    users.trimToSize(); 
    if(existUser(userName)){ 
    int currUserIndex=-1; 
    for(int i=0;i<users.capacity();i++){ 
    if(userName.equals((String)users.get(i))){ 
    currUserIndex=i; 
    break; 


    if (currUserIndex!=-1){ 
    users.remove(currUserIndex); 
    users.trimToSize(); 
    return true; 


    return false; 
    } public Vector getOnLineUser() 

    return users; 

    public void valueBound(HttpSessionBindingEvent e) { 
    users.trimToSize(); 
    if(!existUser(e.getName())){ 
    users.add(e.getName()); 
    System.out.print(e.getName()+"\t 登入到系统\t"+(new Date())); 
    System.out.println(" 在线用户数为:"+getCount()); 
    }else 
    System.out.println(e.getName()+"已经存在"); 
    } public void valueUnbound(HttpSessionBindingEvent e) { 
    users.trimToSize(); 
    String userName=e.getName(); 
    deleteUser(userName); 
    System.out.print(userName+"\t 退出系统\t"+(new Date())); 
    System.out.println(" 在线用户数为:"+getCount()); 

    } ///////////////////////////////////////////////////////// 
    <% 
    /**这是显示在线用户的jsp文件 文件名为onLineUser.jsp 欢迎访问javajia家(http://www.javajia.com),由yuking制作。2001.1.1 
    */ 
    %> 
    <%@ page contentType="text/html;charset=gb2312" %> 
    <%@ page import="onLineUser,java.util.*" %> 
    <jsp:useBean id="onlineuser" class="onLineUser" scope="application"/> 
    <html> 
    <head> 
    <title>搞定JSP在线人数</title> 
    </head> 
    <body> 
    <center> 
    <p><h1>登陆成功,欢迎您访问Java家!</h1></p> 
    </center> 
    <% session = request.getSession(false); %> 
    <% 
    String username=request.getParameter("username"); 
    if (onlineuser.existUser(username)){ 
    out.println("用户<font color=red>"+username+"</font>已经登陆!"); 
    }else{ 
    session.setMaxInactiveInterval(50); //Sesion有效时长,以秒为单位 
    session.setAttribute(username,onlineuser); 
    out.println("欢迎新用户:<font color=red>"+username+"</font>登陆到系统!"); 

    out.println("<br/>当前在线用户人数:<font color=red>"+onlineuser.getCount()+"</font><br/>"); 
    Vector vt=onlineuser.getOnLineUser(); 
    Enumeration e = vt.elements(); 
    out.println("在线用户列表"); 
    out.println("<table border=1>"); 
    out.println("<tr><td>用户名</td></tr>"); 
    while(e.hasMoreElements()){ 
    out.println("<tr><td>"); 
    out.println((String)e.nextElement()+"<br/>"); 
    out.println("</td></tr>"); 

    out.println("</table>"); %> 
    <center> 
    <p>yuking制作</p> 
    <p> </p> 
    <% 
    out.println("<p><a href=logout.jsp?username="+username+">退出系统</a></p>"); 
    %> 
    </center> 
    </body> 
    </html> //////////////////////////////////////////////////////// 
    <% 
    /**这是用户退出的jsp文件 文件名为logout.jsp 欢迎访问javajia家(http://www.javajia.com),由yuking制作。2001.1.1 
    */ 
    %> 
    <%@ page contentType="text/html;charset=gb2312" %> 
    <%@ page import="onLineUser,java.util.*" %> 
    <jsp:useBean id="onlineuser" class="onLineUser" scope="application"/> 
    <html> 
    <head> 
    <title>搞定JSP在线人数</title> 
    </head> 
    <body> 
    <center> 
    <p><h1>登陆成功,欢迎您访问Java家!</h1></p> 
    </center> 
    <% 
    String username=request.getParameter("username"); 
    if(onlineuser.deleteUser(username)) 
    out.println(username+"已经退出系统!"); 
    else 
    out.println(username+"没有登陆到系统!"); 
    %> 
    <center> 
    <p>yuking制作</p> 
    <p> </p> 
    <p><a href="logout.jsp">退出系统</a></p> 
    </center> 
    </body> 
    </html>
      

  3.   


    我曾修改jive forum,为其添加了在线统计的功能,考虑到将来可能有些不太熟悉java的朋友会使用,于是选择了HttpSessionBindingListener,现在系统运转正常(http://www.iswww.net/bbs),agtian (gonglin) 兄弟可以好好看看上面的例子,应该能摆平的
      

  4.   

    to:Zazu(沙祖)
    你说的对,我考虑的知识注册的用户,不考虑匿名的游客。
    如果考虑这个就监听session吧。
    还有,在session失效的情况下,把那条失效的session对应的用户从人数中去掉
    这个时候你需要将session的ID预先记录下来。
    比如说:王晓二登陆后,你的在线名单中有他的名字,但是这个人登陆后就再也没有动那个页面
    session失效后,你的程序需要根据失效的sessionID找到对应的人(匿名就不用管了,减1就行了)
    这个sessionID你可以把它记录在持久层,也可以放在聚集中。
    记住,关于人数跟踪的应用,一定要对你做的方法同步