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]