你可以在数据库中添加一项,当用户登陆的时候该项设为1,等他离开的时候,则该项设为0,这样当一个用户进入的时候session就能保存一个值,要是你就想用session的话那么你就不能重启机器,并且必须时时在线!你可以在session的下面写一个函数,当有一个不同的用户ID进入的时候,你就加1,这样就能行了!!

解决方案 »

  1.   


    网址:http://www.qq222.com/?r=gerard2008
      

  2.   

    作一个的登陆处理的servlet,还有一个bean,
    如果用户合法并且没有在你的在线用户列表里面,
    就加入,并且跳转到相关页面并且传送一个bean对象过去 ,
    就可以知道了
      

  3.   

    窃以为可以建立一个临时表,或者一个变量,把当前所有session的总数写入就是了.每新进一个session,该值加1,每释放一个session,便减1.
      

  4.   

    我怎么能把不同的SESSION值取到呢?
      

  5.   

    当然有办法,你在登录验证完毕过后,就可以利用
    session.setAttribute("variableName",value);
    然后你如果在指定的页面获得这个值,你就可以利用
    session.getAttribute("variableName");
    建议:如果你想保存的信息比较多的话,最好不要用session。
    不知道这样的回答你是否满意,祝你成功!
    For example:
        session.setAttribute("se_name",user_name);//保存用户的姓名,数据表里的字段名称
        session.getAttribute("se_name");//你就可以得到用户的姓名了
    May you success!
      

  6.   

    to dxjsoft():   如果不用Session 的话,请问有什么更好的方法吗?   期待中。
      

  7.   

    一般都是用session来做的,方法正如上面所说但不可能做到完全同步
      

  8.   

    登录时好判断,但如里是丢掉Session,或停电什么的怎么办呢?
      

  9.   

    我认为session是做不到的,它只是服务器和用户之间的一个会话,只属于用户
    它不能被全局使用,也就是其他用户根本不知道其他用户的session,这是session的特点
    如果要获得在线人数好像用application吧,我没有做过。
    我认为可以这样做..
    我想每一个用户登陆的时候,你会写一个javabean来实现它吧
    在这个类中定义一个
    static long count = 0
    的变量,用户登陆一次
    count ++   一次,这个count就是在线人数
    如果要统计未登陆用户的数量我想只能用application吧
      

  10.   

    补充一下
    用户在退出的时候
    还要count --
    至于怎么判断用户是否退出
    你们想想办法
      

  11.   

    用import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionBindingListener;
      

  12.   

    import javax.servlet.http.*;
    import java.util.Hashtable;
    import java.util.Enumeration;/**
     * <pre>
     * 调用方法示例:
     * out.println("当前用户数量 " + SessionListener.getSessionCount() + "<br>");
     * out.println("当前登录用户数量 " + SessionListener.getLoginSessionCount());
     * SessionListener.getSessionUser().put(session.getId(),"张三");
     * </pre>
     */
    public class SessionListener implements HttpSessionListener {
      
      private static Hashtable htSessionUser = new Hashtable();
        
      /**
       * 构造函数
       */
      public SessionListener() {
      }
      
      /**
       * @param se - HttpSessionEvent
       */
      public void sessionCreated(HttpSessionEvent se) {
        htSessionUser.put(se.getSession().getId(),"");     
      }
      
      /**
       * @param se - HttpSessionEvent
       */
      public void sessionDestroyed(HttpSessionEvent se) {
        htSessionUser.remove(se.getSession().getId());     
      }
      
      /**
       * @return Hashtable,该Hashtable的KEY含有所有会话的ID,如果该用户登录,则VALUE含有该用户的id。
       */
      public static Hashtable getSessionUser() {
       return htSessionUser;     
      }
      
      /**
       * @return int,访问当前站点的会话数。
       */
      public static int getSessionCount() {
        return htSessionUser.size();     
      }
      
      /**
       * @return int,访问当前站点的登录会话数。
       */
      public static int getLoginSessionCount() {
        Enumeration em = htSessionUser.elements();
        int i = 0;
        while(em.hasMoreElements()) {
          String sValue = (String)em.nextElement();
          if(!sValue.equals("")) i++;
        }
        return i;     
      }
    }
      

  13.   

    to cosmos10051982(程风破浪):  如果是统计在线人数的话,那么Application 没问题,
    可是我要的是,获取所有在线人员的信息,也就是在线人的ID了。
    这样的话,Application 就很难做了!
      

  14.   

    这确实是个问题,Session 它只能记得最后一个登录用户的值。
    而其实用户登录时,则有不同的值。
    问题是怎么样能把所有“有效” Session 的值都取出来呢?
    问题出现在这个地方?
      

  15.   


    把 session的引用 放到 一个全局的hashtable里就可以了,然后想操作哪个sesssion都可以,还可以踢人(让指定的session强制失效).
      

  16.   

    to  pigo(~_~ ^-^. 。o 0 O O=p&&t=O O 0 o 。. ^-^~_~):   但问题的关键是,如果用户非法退出的话,哈稀表中的值怎么删除呢?
      

  17.   

    1、基于安全原因,HttpSessionContext被取消了。
    2、单纯利用session,很难作出一个真正准确的在线人员列表。HttpSessionListener只能期望session过期或者人为销毁,用起来未免有些古板。
    3、刷新可以做到相对正确的取得在线人员,不过效率和闪烁感不太令人满意。如果只是针对IE的话,试试XMLHTTP,这个东东真的不错。
      

  18.   

    似乎还没有一套完整的解决方案,我想楼主的这个问题应该是一个复杂的协作问题,既要取得SESSION信息,又要设法保存状态,我也没有考虑出好的解决方案,只好多多学习。
      

  19.   

    To cwell(水塘泥巴) 有没有XMLHTTP方面的文章?让我也学习以下!
      

  20.   

    不用 Session 也能实现?“XMLHTTP”是个什么东东?能介绍一下吗?
      

  21.   

    to  pigo(~_~ ^-^. 。o 0 O O=p&&t=O O 0 o 。. ^-^~_~):   但问题的关键是,如果用户非法退出的话,哈稀表中的值怎么删除呢?public class sessionlisten extends HttpServlet implements HttpSessionListener { public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("被释放的 sessionid is "+se.getSession().getId());
        //把session的引用移出,好让系统可以及时释放内存
         }
    }
      

  22.   

    我曾经做过一个大网站的社区,用的是hsqldb建一个内存数据库,
    表字段包括:id(用户ID), first_time(第一次访问时间), last_time(最后一次访问时间), place(在社区的什么地方), doing(正在做什么)
    我在用户没做一次对服务器段的请求时,就会做一系列的工作,最主要的就是比对last_time,我定义的是只要两次请求间隔不操过15分钟就算在现,并修改last_time。同时又一个后台线程没15分钟算一遍内存表,并把那些15分钟自内没有请求的用户删除。
    这样做的效果挺好的,就是对服务器的内存要求高,大访问量的时候对cpu要求也很高。我们的机器是sun的,具体什么型号记不清了,配置是2G memory,2*p42.0G cpu。对于你的需求只用id(用户ID), first_time(第一次访问时间), last_time(最后一次访问时间)就行了。原理一样,不知道你的机器行不行。
      

  23.   

    为了我们的JAVA能不断提高 ,让我们一起努力到"JAVA田地"中.
     那里有很多高手乐意帮忙.也有刚出道的少年. QQ群 号码:4025186
      

  24.   

    /**这是管理user信息的类文件名为onLineUser.java*/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*/
    %>
    <%@ 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>登陆成功,欢迎您访问!</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); file://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>elapsed制作</p>
      <p> </p>
    <%
       out.println("<p><a href='logout.jsp?username="+username+"'>退出系统</a></p>");
    %>
    </center> 
    </body> 
    </html> ////////////////////////////////////////////////////////////////////////////////////
    <%
    /**这是用户退出的jsp文件文件名为logout.jsp*/
    %>
    <%@ 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>登陆成功,欢迎您访问!</h1></p>
    </center>
    <% 
       String username=request.getParameter("username");
       if(onlineuser.deleteUser(username))
           out.println(username+"已经退出系统!");
       else
           out.println(username+"没有登陆到系统!");
    %> 
    <center> 
      <p>elapsed制作</p>
      <p> </p>
      <p><a href="logout.jsp">退出系统</a></p>
    </center> 
    </body> 
    </html>
      

  25.   

    如果用session 最好用servlet中.这样session不易丢失变量/.
      

  26.   

    原先用session来做,研究了半天决定放弃。
    后来想出一种可能比较笨的办法:
    1、在数据库用户表中加入在线状态字段,然后用一个作业每隔一定的时间将它重置为0;
    2、在页面上也每隔一定的时间调用一个方法,将状态字段置为1。要绝对准确好像是不太可能的,不过这个办法目前暂时满足我们项目的需要,没怎么测试,不知道访问人数多了行不行。
      

  27.   

    JSP编程还有很多缺陷和不足,楼主提的这个问题就是个例子。
    所以呀,不要专精这些应用的东西,而要好好深入的研究,
    希望大家编出个像session,application这样的内置组件来解决这个问题,
    这种人才牛!我只是个小菜菜,发表一下感想而以。我用模式一:jsp+javaBean  做过一个小型项目
    做得还行,但我一做完就不想再做JSP了,它太不简单,太不美观。我想你们一定会说用MVC模式二来做就会好一些,但MVC也有很多缺陷。我感觉这东西太不成熟。其实只有一个东西做得简练美观才是最有生命力的。JSP再过一些时间就要Die了。有志之士还是多研究一些更深的东西,虽然开始可能没什么成效,但这种时间和精力决对花得值,不知道我这人是不是太理想化了。
      

  28.   

    不知道楼上所谓更深的东西是指什么呢?
    楼上不用JSP,又高就什么了呢?
      

  29.   

    to nancygreen(Nancy):  兄弟,不会吧!JSP里没有深奥的东西吗?
    这话,是不是有点大了。我遇到的这确实是个难题,
    但这并不能说JSP不行啊,而是我们学的还不够,学得还不深!
      

  30.   

    Session在生成的时候把自己注册到某个公共变量里头。