Cool; I'll give that one a try as well. Do you have any idea which one is likely to give less of a performance hit in an environment of 50 to 100 simultaneous users, where everything is done in a session, and there is no static content?

Dave


Joey Geiger wrote:

Here is the code I use, instead of a filter, I use a listener so I don't
have to worry about setting urls.

This part is in web.xml

<listener>
 <listener-class>yourpackage.SessionListener</listener-class>
</listener>


The majority of this code was found online (and I think came from
coreservlets.com)

package yourpackage;

import java.util.Date;
import java.util.Enumeration;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class SessionListener implements ServletContextListener,
HttpSessionListener{

        private static int sessionCount=0;
        protected transient final Log logger =
LogFactory.getLog(this.getClass());

   public void contextInitialized(ServletContextEvent sce)
   {
         sce.getServletContext().setAttribute("sessionListener",this);
   }

   public void contextDestroyed(ServletContextEvent sce)
   {
   }

   public synchronized void  sessionCreated(HttpSessionEvent event){
                HttpSession session = event.getSession();
//              session.setMaxInactiveInterval(60);
                synchronized (this) {
                        sessionCount++;
                }
                String id = session.getId();
                Date now = new Date();
                String message = new StringBuffer("New Session created on
").append(
                                now.toString()).append("\nID:
").append(id).append("\n")
                                .append("There are now ").append("" +
sessionCount).append(
                                                " live sessions in the
application.").toString();

                this.logger.debug("Created:" + message);
                session.setAttribute("sessionstarted",new Date());
}
   public  void sessionDestroyed(HttpSessionEvent event) {
                HttpSession session = event.getSession();
                String id = session.getId();
        
                synchronized (this) {
                                sessionCount--;
                }

                String message = new StringBuffer("Session destroyed"
                                + "\nValue of destroyed session ID is
").append("" + id)
                                .append("\n").append("There are now ")
                                .append("" + sessionCount).append(
                                                " live sessions in the
application.").toString();
                this.logger.debug("Destroyed: " + message);

                Date d = (Date)session.getAttribute("sessionstarted");
                this.logger.debug("Session Length:
"+millisecondsToString(System.currentTimeMillis() - d.getTime()));
                
                
                Enumeration stuff = session.getAttributeNames();
                while (stuff.hasMoreElements()) {
                        String name = (String) stuff.nextElement();
//                      Object value = session.getAttribute(name);
                        this.logger.debug("Attribute Name:"+name);
                }

}
   public int getSessionCount() { return sessionCount; }


        /**
         * Converts time in milliseconds to a <code>String</code> in the
format Days HH:mm:ss.SSS.
         * @param time the time in milliseconds.
         * @return a <code>String</code> representing the time in the format
Days HH:mm:ss.SSS.
         */
        public static String millisecondsToString(long time)
        {
            int milliseconds = (int)(time % 1000);
            int seconds = (int)((time/1000) % 60);
            int minutes = (int)((time/60000) % 60);
            int hours = (int)((time/3600000) % 24);
       int days = (int)((time/3600000)/24);
//        hours += days*24;
            String millisecondsStr = (milliseconds<10 ? "00" :
(milliseconds<100 ? "0" : ""))+milliseconds;
            String secondsStr = (seconds<10 ? "0" : "")+seconds;
            String minutesStr = (minutes<10 ? "0" : "")+minutes;
            String hoursStr = (hours<10 ? "0" : "")+hours;
            return new String(days+" Days
"+hoursStr+":"+minutesStr+":"+secondsStr+"."+millisecondsStr);
        }

}



-----Original Message-----
From: David Kerber [mailto:[EMAIL PROTECTED] Sent: Thursday, February 09, 2006 9:56 AM
To: Tomcat Users List
Subject: Re: Logging session timeouts

I got your code in, and it compiles, but I don't understand how I configure the url-mapping you refer to. Could you point me to some docs for that? I looked through the web.xml files (both the server one, and the one for the app), but couldn't find anything about url-mapping or filters that seemed to apply to this. It may be there, but I don't know enough about it to recognize it.

Thanks!
Dave


Tim Lucia wrote:

Below is a filter which keeps track of how many sessions are attached to a
web app.  The key part is the HttpSessionBindingListener interface.

Tim


/**
* J2EE "Filter" to count page hits.  What it counts depends on the
url-mapping
* in web.xml.
* * @author tim.lucia
*/
public class SessionCountFilter
  implements Filter, HttpSessionBindingListener, Serializable
{
  private final static Log logger =
LogFactory.getLog(SessionCountFilter.class);
public static final Hashtable sessions = new Hashtable();
  public static int sessionCountHighWater = 0;
/**
   * Container startup notification
   */
public void init(FilterConfig arg0) throws ServletException {
      logger.debug("init(): " + arg0);
  }

  /**
   * Container shutdown notification
   */
public void destroy() {
      logger.debug("destroy()");
  }

  /**
   * Process the container's filter request.
   * @param request - Request object
   * @param response - response object
   * @param chain - next filter in the chain.
*/ public void doFilter(ServletRequest request, ServletResponse response,
                       FilterChain chain)
throws IOException, ServletException {
      chain.doFilter(request, response);

      HttpServletRequest httpRequest = (HttpServletRequest)request;
      HttpSession session = httpRequest.getSession(false);
      if (logger.isDebugEnabled()) {
logger.debug("Request " + httpRequest.getRequestURI() + (session == null ? " returned no session" :
                   " belongs to session ID " + session.getId()));
      }

      // Bind to the session, if there is one, and it is new:
      if (null != session && session.isNew()) {
          session.setAttribute(toString(), this);
      }
  }

  /**
   * Implement HttpSessionBindingListener#valueBound
   */
public void valueBound(HttpSessionBindingEvent bindEvent) {
      HttpSession session = bindEvent.getSession();
      final String sessionID = session.getId();
      sessions.put(session, sessionID);
      if (logger.isDebugEnabled()) {
          logger.debug("[" + sessions.size() + "] CREATE:  " +
sessionID);
      }
sessionCountHighWater = (sessionCountHighWater < sessions.size() ? sessions.size() :
sessionCountHighWater);
  }

  /**
   * Implement HttpSessionBindingListener#valueUnbound
   */
public void valueUnbound(HttpSessionBindingEvent bindEvent) {
      HttpSession session = bindEvent.getSession();
      final String sessionID = (String)sessions.get(session);
      sessions.remove(session);
      if (logger.isDebugEnabled()) {
          logger.debug("[" + sessions.size() + "] DESTROY: " +
sessionID);
      }
  }
/**
   * Return current count of sessions
   * @return The number of sessions currently tracked
   */
  public static int getSessionCount()
  {
      return sessions.size();
  }
/**
   * Return high water mark of number of sessions
   * @return The high water mark of sessions tracked
   */
  public static int getSessionCountHighWater()
  {
      return sessionCountHighWater;
  }
/**
   * Return string representation of this object
   * @return a String representation of this object
   */
  public String toString()
  {
return getClass().getName() + "#" + hashCode(); } }
-----Original Message-----
From: David Kerber [mailto:[EMAIL PROTECTED] Sent: Thursday, February 09, 2006 9:38 AM
To: Tomcat Users List
Subject: Logging session timeouts

Is there any way of trapping session timeouts, so I can log them?  I am
logging when a user logs in and when they explicitly log out, but would
like
to log when their session times out, if that is possible.

TIA!
Dave



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]








---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]






---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to