Aplicación web de campus virtual construida con Java, Servlets y JSP que cubre el ciclo de vida completo de una cuenta de usuario: registro, inicio de sesión, cambio de contraseña y eliminación de la cuenta, con los datos guardados en MySQL.
Proyecto final del curso Programación 2 en la Universidad Mariano Gálvez de Guatemala (2024).
- Registro de usuarios con nombre de usuario, correo electrónico y contraseña. La base de datos impide nombres de usuario repetidos.
- Inicio de sesión que valida las credenciales contra MySQL y guarda al usuario en una sesión HTTP.
- Página de bienvenida personalizada con el nombre de usuario y el correo.
- Cambio de contraseña, que solo se aplica si la contraseña anterior es correcta.
- Eliminación de cuenta con confirmación por contraseña; al completarse, la sesión se cierra.
- Mensajes de error en cada formulario y aviso de éxito al cambiar la contraseña.
Cada formulario JSP envía una petición POST a un servlet. El servlet consulta la base de datos mediante la clase DBConnection y redirige a la página que corresponde según el resultado.
flowchart LR
index["index.jsp<br/>Inicio de sesión"] -->|POST| login[LoginServlet]
index --> register["register.jsp<br/>Registro"]
register -->|POST| reg[RegisterServlet]
login -->|credenciales válidas| welcome["welcome.jsp<br/>Bienvenida"]
welcome --> change["change_password.jsp"]
welcome --> delete["delete_account.jsp"]
change -->|POST| cps[ChangePasswordServlet]
delete -->|POST| das[DeleteAccountServlet]
login --> db[("MySQL<br/>campus.users")]
reg --> db
cps --> db
das --> db
| Ruta | Qué hace | Consulta |
|---|---|---|
/RegisterServlet |
Crea la cuenta y redirige al inicio de sesión | INSERT INTO users (username, email, password) ... |
/LoginServlet |
Valida las credenciales y guarda usuario y correo en la sesión | SELECT * FROM users WHERE username = ? AND password = ? |
/ChangePasswordServlet |
Cambia la contraseña si la anterior coincide | UPDATE users SET password = ? WHERE username = ? AND password = ? |
/DeleteAccountServlet |
Elimina la cuenta tras confirmar la contraseña y cierra la sesión | DELETE FROM users WHERE username = ? AND password = ? |
- Consultas parametrizadas con
PreparedStatementen todas las operaciones, lo que evita la inyección SQL. - Separación por capas: vistas en JSP, lógica en servlets y acceso a datos centralizado en
DBConnection. try-with-resourcespara cerrar la conexión a la base de datos automáticamente.- Mapeo declarativo de los servlets en
web.xml.
CampusLoginApp/
├── database/
│ └── schema.sql # Tabla users
├── src/java/com/campus/
│ ├── db/DBConnection.java # Conexión JDBC a MySQL
│ └── servlets/ # Registro, login, cambio de contraseña y baja
├── web/
│ ├── *.jsp # Vistas
│ ├── css/styles.css # Estilos
│ └── WEB-INF/web.xml # Mapeo de servlets
├── nbproject/ # Configuración del proyecto NetBeans
└── build.xml # Script de compilación Ant
- JDK 23 o superior
- Apache Tomcat 9
- MySQL
- MySQL Connector/J 9.1.0
- Apache NetBeans con soporte para aplicaciones web Java
-
Crea la base de datos y el usuario que usa la aplicación:
CREATE DATABASE campus; CREATE USER 'sql'@'localhost' IDENTIFIED BY '1234'; GRANT ALL PRIVILEGES ON campus.* TO 'sql'@'localhost';
Si prefieres otro usuario o contraseña, cámbialos en
src/java/com/campus/db/DBConnection.java. -
Crea la tabla:
mysql -u sql -p campus < database/schema.sql -
Abre el proyecto en NetBeans (File → Open Project).
-
Si NetBeans avisa de referencias faltantes, haz clic derecho sobre el proyecto, elige Resolve Project Problems e indica la ubicación de
mysql-connector-j-9.1.0.jary del servidor Tomcat 9. -
Ejecuta el proyecto y abre http://localhost:8080/CampusLoginApp/.
- Guardar las contraseñas con un algoritmo de hash, como BCrypt, en lugar de texto plano.
- Leer las credenciales de la base de datos desde configuración externa.
- Comprobar que haya una sesión activa antes de cambiar la contraseña o eliminar la cuenta, e invalidarla al cerrar sesión.
- Escapar los datos que se muestran en las páginas para prevenir XSS.
Erica Franco · @Erica4fr