Perdida de sesion con Tomcat 5 y Struts

Kbza
14 de Enero del 2005
Hola,
Tengo un problema con Tomcat y Struts. El problema es el siguiente... tengo un form de logueo que publica en la sesión un bean de Usuario, el problema empieza cuando 2 usuarios se loguean ... el ultimo en loguearse sobreescribe el bean de Usuario. Es como si Struts no respetara las sesiones.
Alguna sugerencia?
Saludos

les mando la accion que publica los datos en la sesion:
package com.seds.acciones;

import java.sql.*;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import com.seds.forms.*;
import com.seds.beans.*;
import com.seds.DB.conexionBD;
import com.seds.DB.JMenu;


public class LoginAction extends Action {

conexionBD con = new conexionBD();
Usuarios user = new Usuarios();
private String descError;
String menu;

private int updVisita(String nomb_usr, String IP, Connection conn){
try{
Statement stmt = conn.createStatement();
String query = "UPDATE Usuarios SET ";
query +="ip_ult_visita='"+IP+"', ";
query +="ult_visita= fecha()";
query +=" WHERE nomb_usr='"+nomb_usr+"'";
int rs = stmt.executeUpdate(query);
return 0;
}
catch (SQLException ex){
descError= ex.getMessage();
descError = descError.replaceAll(""", "*");
descError = descError.substring(0, descError.length() - 1);
return -1;
}
}

private int Autenticar(String usuario, String password, HttpServletRequest request) {

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
int resultado = 0;

//ServletContext context = servlet.getServletContext();
//DataSource dataSource = (DataSource) context.getAttribute(Action.DATA_SOURCE_KEY);

try {
conn = con.Conectarse("jdbc:postgresql://192.168.0.3:5432/SEDS","menu","sedsmenu");
stmt = conn.createStatement();
String query = "SELECT * FROM usuarios ";
query += "WHERE nomb_usr='"+usuario+"' AND pwd_usr='"+password+"'";
rs = stmt.executeQuery(query);
if (rs.next()) {
// Cargamos un bean Usuario con todos los datos
user.setNomb_usr(rs.getString("nomb_usr"));
user.setPwd_usr(rs.getString("pwd_usr"));
user.setIp_ult_visita(request.getRemoteAddr());
user.setPerfilid(rs.getString("perfilid"));
user.setActivo(rs.getBoolean("activo"));
user.setCaduca_pwd(rs.getInt("caduca_pwd"));
user.setCambia_pwd(rs.getBoolean("cambia_pwd"));
user.setFecha_pwd(rs.getString("fecha_pwd"));

// Nos conectamos a la DB con el nombre y el pwd del usuario
conn.close();
conn = con.Conectarse("jdbc:postgresql://192.168.0.3:5432/SEDS", user.getNomb_usr(), user.getPwd_usr());
user.setDbconn(conn);

// Hacemos el update de la visita
if (updVisita(user.getNomb_usr(), user.getIp_ult_visita(), conn) < 0){
resultado = -1;
}
// Controlamos que la contraseña sea distinta del nombre de usuario
else if (user.getNomb_usr().equals(user.getPwd_usr())){
resultado = 3;
}
else if (rs.getBoolean("activo")){
resultado = 1; // Usuario activo, todo OK
}
else{
resultado = 2; // Usuario no está activo
}

// Cargamos al usuario su menu propio
JMenu jmenu = new JMenu("org.postgresql.Driver",user.getDbconn(),user.getPerfilid());
user.setMenu(jmenu.armaMenu());
}
}
catch (SQLException ex) {
resultado = -1;
descError= ex.getMessage();
descError = descError.replaceAll(""", "*");
descError = descError.substring(0, descError.length() - 1);
}
return resultado;
}

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {

String target;
int autenticado = 0;

// Usamos el LoginForm para obtener los datos del request
String usuario = ((LoginForm)form).getUsuario();
String password = ((LoginForm)form).getPassword();

autenticado = Autenticar(usuario, password, request);
if (autenticado == 1) { // Usuario activo, todo OK
target = "OK";
// Añadimos el bean Usuario a la sesión
HttpSession session = request.getSession();
session.setAttribute("usuario", user);
//session.putValue("usuario", user);
}else if (autenticado == 0) { // Si Usuario no existente o contraseña incorrecta
// Seteamos el destino
target = "login";
// Añadimos el error
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("errors.login.unknown","error"));
// Reportamos los errores ocurridos
if (!errors.empty()) {saveErrors(request, errors);}
}else if (autenticado == 2){ // Si Usuario no está activo
target = "login";
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("errors.login.inactive","error"));
if (!errors.empty()) {saveErrors(request, errors);}
}else if (autenticado == 3){ // Si el nombre de usuario es igual a la contraseña
target = "CHPWD";
// Añadimos el bean Usuario a la sesión
HttpSession session = request.getSession(true);
//session.putValue("usuario", user);
session.setAttribute("usuario", user);
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("errors.chpwd.same","error"));
if (!errors.empty()) {saveErrors(request, errors);}
}else { // Error desconocido o de acceso a DB
target = "login";
ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("errors.other","error",descError));
if (!errors.empty()) {saveErrors(request, errors);}
}
// Hacemos el forward a la vista correspondiente
return (mapping.findForward(target));
}
}