给客户做了个网站,客户要求统计在线人数,包括不登录的,打开网页的,都算,这样用session就不行了,请问有什么好办法.急急急.

解决方案 »

  1.   

    用session监听器吧
    代码参考部分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
    =========
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4"
     xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    ...............
    <!-- Listeners -->
    <listener>
    <listener-class>
    SessionCount.SessionCounter
    </listener-class>
    ...............
    </listener>
    </web-app>
    ===============
    test.jsp
    <%@ page language="Java"  contentType="text/html;charset=GBK"%>
    <%@ page import="java.sql.*"%>
    <%@ page import="SessionCount.SessionCounter" %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK">
    <title>无标题文档</title>
    <body bgcolor="#FFFFFF">
           在线:<%=SessionCounter.getActiveSessions()%>
        </body></html>
      

  2.   

    "包括不登录的,打开网页的,都算,这样用session就不行了",  他不登录也是有session的。
      

  3.   

    session 跟登录不登录没有关系楼主搞清楚基础概念哦。。
      

  4.   


    import java.util.Map;
    import java.util.HashMap;
    import javax.servlet.http.*;
    import javax.servlet.ServletContext;
    public class UserInfo implements HttpSessionBindingListener {
    // 用户信息
    int userId;
    String userName;
    ......
    /**
     * 当UserInfo类被绑定到session中时触发这个事件
     * 具体信息请参见Servlet/JSPs的规范
     */
    public void valueBound(HttpSessionBindingEvent event) {
    HttpSession session = event.getSession ();
    ServletContext ctx = session.getServletContext ();
    Map map = (Map)ctx.getAttribute ("users");
    if (map == null) { // 如果是服务器启动后的第一个登录用户,新建一个容器
    map = new HashMap ();
    ctx.setAttribute ("users", map);
    }
    map.put (userName, this.userName); // 把自己加入容器中
    }
    /**
     * 当UserInfo类从session中删除时触发这个事件
     * 具体信息请参见Servlet/JSPs的规范
     */
    public void valueUnbound(HttpSessionBindingEvent event) {
    HttpSession session = event.getSession ();
    ServletContext ctx = session.getServletContext ();
    Map map = (Map)ctx.getAttribute ("users");
    map.remove (this.userName); // 把自己从容器中删除
    }
    ......
    }
    JSP页面中使用以下代码: 
    <%
    int userCount = 0;
    java.util.Map map = (java.util.Map)application.getAttribute ("users");
    if (map == 0) userCount = 0;
    else userCount = map.size ();
    %>;
      

  5.   

    HttpSessionBindingListener 实现这个的似乎是有操作session比如session.setAttribute("user",user);这样的,可以计算登录的用户有多少.
    再上面的那个呢,可以计算所有在这个网站的人数有多少.了一个用户一个session,包括不登录的.
    不知道这样说对不.
    网站上看到的,在线人数,注册用户两个区别是不是这两个的区别啊.
      

  6.   

    用session监听,创建一个session的时候,说明一个用户来了,
    销毁一个session的时候,说明一个用户走了,
    登录一个用户的时候,说明是注册用户,
    另外在销毁一个session的时候,你判断下是不是注册用户,不就完了,
    这就会统计出在线用户,在线的注册会员了。
      

  7.   

    然后怎么统计出在线人数呢?可以判断session的数量吗?
      

  8.   

    session监听器能够很好地统计用户在线人数的功能!
      

  9.   

    打开浏览器 就有session了啊  用监听器吧
      

  10.   

    http是无状态协议,服务器无法保持连接,通过Session服务器可以保持会话
    不登陆也是有session产生的,我觉得session可行。
      

  11.   

    用APPLICATION啦,这个和SESSION是JSP的9个隐含对象之一,它的作用域比SESSION要大!!
      

  12.   

    写个类,包含两个静态成员,一个是在线人数,一个是登录的注册用户,来个session
    加一,走个session减一,不就得了。
      

  13.   

    用集合放到session里面,然后取出判断集合的长度,集合的size()就行吧