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]

Reply via email to