如果是SHUTDOWN时要记录,那能不能在数据表建一个在线的用户表,然后记录相关内容呢?

解决方案 »

  1.   

    你的tomcat怎么shutdown?
    如果是直接关掉,有时间让你的程序做那些动作吗?一个java的解释平台都没了,用什么来执行?
    除非你的程序是独立于tomcat来运行(从你的问题看肯定不是),或者在shutdown的方法上控制,如通过你的程序发出shutdown的指令,我想这才有控制的可能吧
    这方面的事没做过,只是一点想法。
    不过我觉得,你这个动作有必要吗?删了之后干什么?发个alert给每个用户告诉他们tomcat关了?还是清空数据记录?如果是清数据记录,还不如在启动时做一个初始化,把所有连接都删掉。
      

  2.   

    手动重启TOMCAT,先关闭再启动。
    我要记录用户在线的总时间,那当系统关闭时,所有用户当然都退出啦,就是一次登录的终点。
    现在我可以记录他们登录、注销、超时退出,就是不能记录他们在SHUTDOWN时的事件。
    我可以在 ContextDestroyed()方法里记录Shutdown事件,但不能记录此时系统停止一切session的事件。
    当然,我可以在ContextDestroyed()方法里操作数据库删除记录,登记事件,但这与session没有直接的联系啊。我是想监听一切的session事件,包括Shutdown时,然后写入到 XML文件里。
    现在就差SHUTDOWN时的事件了。究竟Tomcat 在 Shutdown时是怎样处理还没过期的session的呢?
      

  3.   

    有没有全面介绍session的文章。想学,谢谢!!
      

  4.   

    有没有全面介绍session的文章。想学,谢谢!!请把网址发到我的短消息里行吗?
      

  5.   

    关注。能不能把其它的session的方法贴出来看一下,学习学习。呵呵
    顶...
      

  6.   

    to  jfy3d(剑事):
    我就是用listener 啊。
    HttpSessionBindingListener,ContextListener.
    问题是我的想法怎样实现。
      

  7.   

    <listener>
      <listener-class>
       com.Listener
      </listener-class>
     </listener>
    public class Listener  implements HttpSessionListener
    {

    public void sessionCreated(HttpSessionEvent evt)
    {

    想干什么就些上
    } public void sessionDestroyed(HttpSessionEvent evt)
    {
    想干什么就些上
    }
    }
      

  8.   

    这样好像不行的。
    任何浏览器打开或reaload都会触发sessionCreated和sessionDestroyed事件。
    这个我验证过了。
      

  9.   

    package com;import javax.servlet.http.*; 
    import javax.servlet.*; 
    import java.util.Date; 
    import java.sql.*;
    import java.net.URL;
    import java.text.*;
    import java.util.Vector;
    import java.net.Socket.*;
    public class listen implements HttpSessionBindingListener  { 
         public listen(){
       } 
       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();
    HttpSession session = e.getSession();
    session.getAttribute("teleno");

           if(!existUser(e.getName())){
               users.add(e.getName());
               try
    {
    java.util.Date dt = new java.util.Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String logintime=sdf.format(dt);
    String url = "jdbc:bea:sqlserver://localhost:1433;DatabaseName=Community";

    Class.forName("weblogic.jdbc.sqlserver.SQLServerDriver");
    Connection con = DriverManager.getConnection(url,"sa","jfy");
    PreparedStatement stmt = con.prepareStatement("insert into  UserLoginInfo(Telephone,LoginTime,SessionID,UserIP) values('"+e.getName()+"','"+logintime+"','"+session.getId()+"','"+session.getAttribute("ip")+"')");

    stmt.executeUpdate();

    stmt.close();
    con.close();
    }catch(java.lang.Exception ex){
    ex.printStackTrace();
    }
               System.out.print(session.getAttribute("ip")+"\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);
           HttpSession session = e.getSession();
           try
    {
    java.util.Date dt = new java.util.Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String logouttime=sdf.format(dt);
    String url = "jdbc:bea:sqlserver://localhost:1433;DatabaseName=Community";

    Class.forName("weblogic.jdbc.sqlserver.SQLServerDriver");
    Connection con = DriverManager.getConnection(url,"sa","jfy");
    PreparedStatement stmt = con.prepareStatement("update  UserLoginInfo set LogoutTime='"+logouttime+"' where SessionID='"+session.getId()+"'");

    stmt.executeUpdate();

    stmt.close();
    con.close();
    }catch(java.lang.Exception ex){
    ex.printStackTrace();
    }
           System.out.print(userName+"\t   退出系统\t"+(new Date()));
           System.out.println("      在线用户数为:"+getCount());
         } 

      

  10.   

    借问一下搂主
    Tomcat启动事件怎么实现的啊?谢谢
    [email protected]
      

  11.   

    你可以找些书或上网搜索一下:
    ServletContext对象,ServletContextListener接口。在Tomcat的web.xml里可以设置启动Tomcat时一起启动的servlet,
    在servlet中继承ServletContextListener接口,覆盖其中的servletInitialized()方法。还有继承HttpSessionBindingListener接口,覆盖其中的方法。
    就可以实现你需要的启动事件。
      

  12.   

    想学一下祥细一点的Session 
    可是哪里有资料呢?
      

  13.   

    实现HttpSessionBindingListener的两个方法valueUnbound与valueBound.把这方法绑定你的SESSION对象。
      

  14.   

    "任何浏览器打开或reaload都会触发sessionCreated和sessionDestroyed事件。"不会吧.应该只有新的IE打开才会有。因为默认情况下sessionid存储于cookies,而cookies独立于IE。你这样的需求看上去用一个application中的List维持用户信息更合理。session的可见性限制他的功能。
      

  15.   

    其实这样做有什么意义呢?如果有一个用户上了一会儿直接关闭IE,然后再打开新的IE上线,那么岂非在用户表中保存两个一样的用户?那是算一个人还是算两个?,如果很多人用同样的ID上线,那又该怎么办?
      

  16.   

    to  diaopeng(遥远)
    每个用户都有唯一标识存储到列表,比如IP和用户名,这是你自己定义的。
    同一个用户不会同时存储两次。而且上一个用户sessionid会在一段时间后自动过期。再者,有谁那么无聊来扰乱你的“在线人数”呢?没有绝对的“在线”概念,
    如果他打开了网页,但不看,你说他是“在线”还是“不在线”?
      

  17.   

    我上面说了,用application level的list或者数据库维护这些信息比较合理一点。session可见性不是全局性的。如果用户不登陆没有username,那么就无法唯一确定用户来源。因为对于局域网用户,ip是一样的;而sessionid独立于ie。其实有时候不需要太较真,sessionid大多情况已经满足要求。web是request/response模式,本身决定了这类统计没有准确性可言。