Thanks for the reply - posting code that should work(sorry for the amount....)
SessionManager & UserCredentials
from InstantJavaServerPages
** extra bucks available **
//SessionManager - scope=application
package com.srcdesign;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import javax.servlet.ServletContext;
public class SessionManager
{private Hashtable currentLogins;
private ConnectionPool connectionPool;
private boolean initialized = false;
private static final int TIMEOUT_MINUTES = 5;
private static final long ONE_MINUTE = 60000L;
private static final String POOL_CFG_FILE = "ConnectionPool.cfg";
private static final String SELECT_PASSWORD = "SELECT password FROM idpassword WHERE userid = ";
private static final String SELECT_ACCOUNT_STATUS = "SELECT COUNT(*) FROM idpassword WHERE status = false AND userid = ";
private static final String UPDATE_ACCOUNT_STATUS = "UPDATE idpassword SET status = false WHERE userid = ";
private static final String SELECT_SESSION_STATS = "SELECT COUNT(*) FROM sessionstats WHERE sessionid = ";
private static final String UPDATE_SESSION_STATS = "UPDATE sessionstats SET endtime = ";
private static final String INSERT_RAW_STATS = "INSERT INTO rawpagestats" + "(userid, sessionid, dt, tm, pagedesc) VALUES (";
private static final String HITS_PLUS_QUALIFIER = "hits = hits + 1 WHERE sessionid = ";
private static final String RPAREN = ")";
private static final String COMMA = ",";
private static final String QUOTE = "'";
private class LoginProfile extends UserCredentials
{boolean isLoggingIn;
int loginAttempts;
boolean isLoggedIn;
Date loginTime;
Date lastActivity;
boolean isAlive;
int minutesToTimeout;
public LoginProfile(UserCredentials credentials)
{setUser(credentials.getUser());
setPassword(credentials.getPassword());
isLoggingIn = true;
isLoggedIn = false;
loginAttempts = 0;
isAlive = false;
minutesToTimeout = TIMEOUT_MINUTES;
}
}
class InactivityMonitor implements Runnable
{public void run()
{while (true)
{try
{Thread.sleep(ONE_MINUTE);
synchronized (currentLogins)
{Enumeration keyEnumerator = currentLogins.keys();
Vector expiredKeys = new Vector();
while (keyEnumerator.hasMoreElements())
{String key = (String)keyEnumerator.nextElement();
processElement(expiredKeys, key);
}
Enumeration expiredEnumerator = expiredKeys.elements();
while (expiredEnumerator.hasMoreElements())
{currentLogins.remove(expiredEnumerator.nextElement());
}
}
}
catch (InterruptedException e)
{
}
} // end while
}
private void processElement(Vector expiredKeyTable, String key)
{LoginProfile profile = (LoginProfile)currentLogins.get(key);
if (!profile.isLoggingIn)
{//if (!profile.isAlive) {
if (profile.minutesToTimeout <= 0)
{// mark this one for removal
expiredKeyTable.add(key);
}
else
{// prepare for removal in 5 minutes time...
//profile.isAlive = false;
--profile.minutesToTimeout;
currentLogins.put(key,profile);
}
}
}
}
public SessionManager()
{
}
public void initialize() throws Exception
{if (initialized)
{return;
}
connectionPool = new ConnectionPool();
connectionPool.initialize(POOL_CFG_FILE);
currentLogins = new Hashtable();
InactivityMonitor monitor = new InactivityMonitor();
Thread monitorThread = new Thread(monitor);
monitorThread.start();
initialized = true;
}
public boolean isLoggingIn(UserCredentials credentials)
{boolean loggingIn = false;
String user = credentials.getUser();
synchronized (currentLogins)
{if (currentLogins.containsKey(user))
{LoginProfile aProfile = (LoginProfile)currentLogins.get(user);
loggingIn = aProfile.isLoggingIn;
}
}
return loggingIn;
}
public boolean alreadyLoggedIn(UserCredentials credentials)
{boolean loggedIn = false;
String user = credentials.getUser();
synchronized (currentLogins)
{if (currentLogins.containsKey(user))
{LoginProfile aProfile = (LoginProfile)currentLogins.get(user);
loggedIn = aProfile.isLoggedIn;
}
}
return loggedIn;
}
public int getLoginAttempts(UserCredentials credentials)
{int loginAttempts = 0;
String user = credentials.getUser();
synchronized (currentLogins)
{if (currentLogins.containsKey(user))
{LoginProfile aProfile = (LoginProfile)currentLogins.get(user);
loginAttempts = aProfile.loginAttempts;
}
}
return loginAttempts;
}
public void incrementLoginAttempts(UserCredentials credentials)
{String user = credentials.getUser();
synchronized (currentLogins)
{if (currentLogins.containsKey(user))
{LoginProfile aProfile = (LoginProfile)currentLogins.get(user);
++aProfile.loginAttempts;
currentLogins.put(user, aProfile);
}
}
}
public boolean keepAlive(UserCredentials credentials, String pageInfo) throws SQLException
{if (!alreadyLoggedIn(credentials))
{return false;
}
updateSessionStats(credentials);
String user = credentials.getUser();
synchronized (currentLogins)
{if (currentLogins.containsKey(user))
{LoginProfile aProfile = (LoginProfile)currentLogins.get(user);
aProfile.isAlive = true;
aProfile.minutesToTimeout = TIMEOUT_MINUTES;
currentLogins.put(user, aProfile);
}
}
logRawStats(credentials, pageInfo);
return true;
}
private int getCount(ResultSet rs) throws SQLException
{rs.next();
return rs.getInt(1);
}
public boolean isSuspended(UserCredentials credentials) throws SQLException
{String user = credentials.getUser();
Connection conn = connectionPool.getConnection();
Statement qs = conn.createStatement();
ResultSet rs = qs.executeQuery(SELECT_ACCOUNT_STATUS + QUOTE + user + QUOTE);
boolean tf = (getCount(rs) > 0);
connectionPool.close(conn);
return tf;
}
public void suspendAccount(UserCredentials credentials) throws SQLException
{String user = credentials.getUser();
synchronized (currentLogins)
{currentLogins.remove(user);
}
Connection conn = connectionPool.getConnection();
Statement us = conn.createStatement();
us.executeUpdate(UPDATE_ACCOUNT_STATUS + QUOTE + user + QUOTE);
connectionPool.close(conn);
}
public boolean login(UserCredentials credentials) throws SQLException
{if (alreadyLoggedIn(credentials))
{return false;
}
String user = credentials.getUser();
LoginProfile profile;
synchronized (currentLogins)
{if (currentLogins.containsKey(user))
{profile = (LoginProfile)currentLogins.get(user);
}
else
{profile = new LoginProfile(credentials);
}
}
Connection conn = connectionPool.getConnection();
Statement qs = conn.createStatement();
ResultSet rs = qs.executeQuery(SELECT_PASSWORD + QUOTE + user + QUOTE);
while (rs.next())
{if (rs.getString(1).equals(credentials.getPassword()))
{profile.isLoggingIn = false;
profile.isLoggedIn = true;
break;
}
}
synchronized (currentLogins)
{currentLogins.put(user, profile);
}
return profile.isLoggedIn;
}
public void initiateSessionLogging(UserCredentials credentials) throws SQLException
{String user = credentials.getUser();
String sessionId = credentials.getSessionId();
Connection conn = connectionPool.getConnection();
Statement qs = conn.createStatement();
ResultSet rs = qs.executeQuery(SELECT_SESSION_STATS + QUOTE + sessionId + QUOTE + " AND userid = " + QUOTE + user + QUOTE);
if (getCount(rs) == 0)
{java.util.Date dt = new java.util.Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ft = sdf.format(dt);
Statement us = conn.createStatement();
us.executeUpdate("insert into sessionstats " + "(sessionid, userid, starttime, endtime, hits) VALUES (" + QUOTE + sessionId + QUOTE + COMMA + QUOTE +user + QUOTE + COMMA + QUOTE + ft + QUOTE + COMMA + QUOTE + ft + QUOTE + COMMA + "0" + RPAREN);
}
connectionPool.close(conn);
}
public void logRawStats(UserCredentials credentials, String pageInfo) throws SQLException
{String user = credentials.getUser();
String sessionId = credentials.getSessionId();
java.util.Date dt = new java.util.Date();
SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd");
String fd = sdfd.format(dt);
SimpleDateFormat sdft = new SimpleDateFormat("HH:mm:ss");
String ft = sdft.format(dt);
Connection conn = connectionPool.getConnection();
Statement us = conn.createStatement();
us.executeUpdate(INSERT_RAW_STATS + QUOTE +user + QUOTE + COMMA + QUOTE + sessionId + QUOTE + COMMA + QUOTE + fd + QUOTE + COMMA + QUOTE + ft + QUOTE + COMMA + QUOTE + pageInfo.replace('\'','`') + QUOTE + RPAREN);
connectionPool.close(conn);
}
public void updateSessionStats(UserCredentials credentials) throws SQLException
{String user = credentials.getUser();
String sessionId = credentials.getSessionId();
Connection conn = connectionPool.getConnection();
Statement qs = conn.createStatement();
ResultSet rs = qs.executeQuery(SELECT_SESSION_STATS + QUOTE + sessionId + QUOTE + " and userid = " + QUOTE + user + QUOTE);
if (getCount(rs) > 0)
{java.util.Date dt = new java.util.Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ft = sdf.format(dt);
Statement us = conn.createStatement();
us.executeUpdate(UPDATE_SESSION_STATS + QUOTE + ft + QUOTE + COMMA + HITS_PLUS_QUALIFIER + QUOTE + sessionId + QUOTE);
}
connectionPool.close(conn);
}
public void logout(UserCredentials credentials)
{synchronized (currentLogins)
{currentLogins.remove(credentials.getUser());
}
}
}
//=====================================
// UserCredentials - scope=session
package com.srcdesign;
public class UserCredentials
{private String user;
private String password;
private String sessionId;
public UserCredentials()
{user = "";
password = "";
sessionId = "";
}
public String getUser()
{return user;
}
public void setUser(String user)
{this.user = user;
}
public String getPassword()
{return password;
}
public void setPassword(String password)
{this.password = password;
}
public String getSessionId()
{return sessionId;
}
public void setSessionId(String sessionId)
{this.sessionId = sessionId;
}
}
** Here it is...thanks in advance. **
Internal Servlet Error:
javax.servlet.ServletException: com.srcdesign.SessionManager
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:459)
at _0002flogin_0002ejsplogin_jsp_50._jspService(_0002flogin_0002ejsplogin_jsp_50.java:138)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:177)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:318)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:391)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)
at org.apache.tomcat.core.Handler.service(Handler.java:286)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743)
at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210)
at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498)
at java.lang.Thread.run(Thread.java:484)
//===================================
Root cause:
java.lang.ClassCastException: com.srcdesign.SessionManager
at _0002flogin_0002ejsplogin_jsp_50._jspService(_0002flogin_0002ejsplogin_jsp_50.java:63)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:177)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:318)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:391)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)
at org.apache.tomcat.core.Handler.service(Handler.java:286)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743)
at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210)
at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498)
at java.lang.Thread.run(Thread.java:484)