Foros del Web » Programación para mayores de 30 ;) » Java »

[Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Estas en el tema de [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL en el foro de Java en Foros del Web. Buenas tardes compañeros y amigos. Si te llegas a perder en este tutorial no te preocupes, al final encontraras un link para descargar el proyecto ...
  #1 (permalink)  
Antiguo 20/07/2011, 13:59
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 6 meses
Puntos: 188
[Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Buenas tardes compañeros y amigos.

Si te llegas a perder en este tutorial no te preocupes, al final encontraras un link para descargar el proyecto completo.

Mirando en las FAQS del foro de JAVA y utilizando el buscador no dí con un aporte de éste tema, así que aquí estoy publicando.

En este tema hablaremos de una de las formas para conseguir programar un registro y logeo de usuarios utilizando Servlets, JSP y MySQL, implícitamente dividiremos la programación en una arquitectura de 3 capas o niveles, en la capa de presentacion no usaremos propiamente código JAVA si no en su lugar usaremos taglibs y ExpressionLanguage. Mas adelante explicaremos a que me refiero con capas y la importancia de estas.

Proyecto realizado en NetBeans.

ARQUITECTURA DE 3 CAPAS.

En el libro Head First Servlets de Kathy Sierra pag 773, nuestra querida autora ofrece una de las mejores explicaciones que he visto en los libros mas populares de Java con JSP y ServLets. Pero yo solo ofrezco una de la mas breves e introductoras informaciones poco útiles que existen en Internet.

* Capa de presentación: (Son los JSP) Formada por código HTML, JavaScript, Ajax y para representar Java - ExpressionLanguage y TagLibs.

* Capa de lógica o control: Propiamente JAVA usando Servlets

*Capa de datos: Los llamaremos Beans, contienen los metodos que realizan las operaciones en el lenguaje de la base de datos, en nuestro caso SQL.


Para profundizar en el tema recomiendo el libro de Kathy Sierra - Head First Servlets o visitar google.
+Breve info: http://www.di-mare.com/adolfo/cursos.../pp-3capas.pdf
-----------------------------------------------------------------------------------------

Comenzaremos creando un proyecto en netbeans. (Yo estoy utilizando la version 7 aunque en la version 6 en este aspecto es exactamente igual en cuando a los pasos que hay que seguir)

Cita:
NOTA: Hay que tener instalado TomCat 5+; Si te descargaste la version mas pesada del NetBeans y cuando lo instalaste lo hiciste de la forma correcta, es decir dando click en "aceptar/aceptar/aceptar" entonces ya lo tienes instalado ;D. En caso contrario puedes volver a correr el paquete de instalación del netbeans o seguir este tema: http://www.bibigeek.com/2009/05/12/i...nte-instalado/
Código ForosDelWeb:
Ver original
  1. * El tipo de proyecto será: Java Web - Web Application
  2. * Yo le llamaré 'JavaWeb1'
  3. * El server que usaré sera: Apache Tomcat 7
  4.    Java EE version: Java EE 5
  5.    Context Path: /JavaWeb1
  6.    Frameworks: Ninguno

Se nos crea un index.jsp por defecto. Comenzaremos a trabajar aqui.

index.jsp será una página que se mostrará exclusivamente en caso de que exista alguna sesion iniciada, en otras palabras, que algun usuario se haya ingresado con su Usuario y contraseña correctamente, por lo que utilizaremos una condicional para verificar.

--------------------------------------------------- ANOTACIÓN
Hemos hablado que los archivos JSP corresponden a la Capa de presentación, por lo que el uso de código Java en este archivo "tratándose de una arquitectura de 3 capas" no sería correcto aunque si sería funcional.

Cita:
Tocando el tema de lo "correcto e incorrecto"; Vale aclarar que el uso de código Java en un JSP no es inadecuado o incorrecto, lo que sucede es que en principio cuando diseñadores y programadores trabajaban juntos surgieron problemas ya que el Diseñador tenía que saber Java para poder manipular correctamente los JSP. Para solucionar ésto aparecieron unas etiquetas llamadas TagLibs.
Las Taglibs tienen un limitado de programación Java, pero el suficiente. Yo en mi experiencia de 1 mes en programación Java ... xD .... no me he topado con limitantes, sin embargo Kathy Sierra nos menciona algunos ejemplos en su guia de estudio para obtener el SCJP (Sun Certified Programmer for Java 6 - Kathy Sierra)

-----------------------------------------------------------------------------------------------------
El nombre de la base de datos de este ejemplo es: javaweb1
y la tabla:

Código SQL:
Ver original
  1. CREATE TABLE `usuarios` (
  2.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `email` VARCHAR(100) NOT NULL,
  4.   `password` VARCHAR(50) NOT NULL,
  5.   `name` VARCHAR(100) NOT NULL,
  6.   PRIMARY KEY  (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

___________________________________

Para comenzar a utilizar TagLibs y MySQL hay que añadir 2 librerias al proyecto. Click sobre el nombre de proyecto "JavaWeb1", propiedades, librerias y añadimos JSTL1.1 y MySQL JDBC Driver

Añadimos esta linea en la parte mas superior (debajo de los comentarios) de nuestro index.jsp, login.jsp y register.jsp

Código java:
Ver original
  1. <%@taglib prefix="t" uri="http://java.sun.com/jsp/jstl/core" %>

--------------------------------------[COLOR="rgb(46, 139, 87)"]ANOTACIÓN[/COLOR]

Supongo que muchos ya esta aburridos, siento que este tema se haya extendido tanto pero me pareció importante dar un poco de teoría y no solo código explicado. Sin embargo, ahora pasemos a "solo código Explicado"
--------------------------------------------------------------------------

* Crearemos un "bean" para realizar todos los métodos necesarios de las consultas SQL. (Recordar que los "beans" pertenecen a la "capa de datos" así que podemos crear un nuevo paquete que se llame "Beans" dentro del Source Packages, dentro de éste paquete creare un Java Class llamado "Dao.java"


Código java:
Ver original
  1. package beans;
  2. import java.sql.*;
  3.  
  4. public class Dao {
  5.     public Connection conexion;
  6.     public final static String userDb = "root";
  7.     public final static String passDb = "123456";
  8.    
  9.    
  10.     //Conectar a la Base de datos
  11.     public void conectar() throws SQLException,ClassNotFoundException{
  12.          Class.forName("com.mysql.jdbc.Driver");
  13.          conexion=DriverManager.getConnection("jdbc:mysql://localhost:3306/javaweb1",userDb, passDb);
  14.     }
  15.     //Desconectar a la Base de datos
  16.     public void desconectar() throws SQLException, ClassNotFoundException{
  17.         conexion.close();
  18.     }
  19.    
  20.     //Metodo para consultar si un email y contraseñan pertenecen a una cuenta registrada
  21.     public boolean isAcountExists(String email, String password) throws SQLException{
  22.         String sql = "SELECT * FROM usuarios WHERE email='"+email+"' AND password='"+password+"'";
  23.         PreparedStatement ps = conexion.prepareStatement(sql);
  24.         ResultSet rs = ps.executeQuery();
  25.        
  26.         return rs.next();
  27.     }
  28.    
  29.     //Metodo para consultar si el email recibido ya esta registrado
  30.     public boolean isEmailRegistered(String email) throws SQLException{
  31.         String sql = "SELECT * FROM usuarios WHERE email='"+email+"'";
  32.         PreparedStatement ps = conexion.prepareStatement(sql);
  33.         ResultSet rs = ps.executeQuery();
  34.  
  35.         return rs.next();
  36.     }
  37.    
  38.     //Metodo para registrar una cuenta
  39.     public void registerUser(String email, String password, String name) throws SQLException{
  40.         String sql = "INSERT INTO `usuarios`(`email`,`password`,`name`) VALUES ('"+email+"','"+password+"','"+name+"')";
  41.         PreparedStatement ps = conexion.prepareStatement(sql);
  42.         ps.executeUpdate();
  43.     }
  44.    
  45.    
  46.    
  47. }


* Crearemos otro "bean" para obtener el nombre de un usuario

--> Se me ocurren 2 formas. Obtenerlo mediante una consulta SQL y devolver una cadena, u obtenerlo mediante un objeto que llama a una consulta SQL.

1° Forma:

DaoUser.java
Código java:
Ver original
  1. package beans;
  2. import java.sql.*;
  3.  
  4. public class DaoUser extends Dao {
  5.    
  6.    
  7.     public String getNameByEmail(String email) throws SQLException{
  8.         String sql = "SELECT * FROM usuarios WHERE email='"+email+"'";
  9.         PreparedStatement ps = conexion.prepareStatement(sql);
  10.         ResultSet rs = ps.executeQuery();
  11.        
  12.         if(rs.next()){
  13.             return rs.getString("name");
  14.         }
  15.        
  16.         return null;
  17.     }
  18. }

[COLOR="rgb(255, 140, 0)"]2° Forma:[/COLOR]

DaoUser2.java
Código java:
Ver original
  1. package beans;
  2.  
  3. public class DaoUser2 extends Dao{
  4.     public String userName;
  5.     public String email;
  6.  
  7.    
  8.     public DaoUser2(String email){
  9.         DaoUser d = new DaoUser();
  10.         try {
  11.             d.conectar();
  12.            
  13.             setUserName(d.getNameByEmail(email));
  14.            
  15.             d.desconectar();
  16.         } catch (Exception e) {}
  17.     }
  18.    
  19.     public String getUserName() {
  20.         return userName;
  21.     }
  22.  
  23.     public String getEmail() {
  24.         return email;
  25.     }
  26.  
  27.     public void setUserName(String userName) {
  28.         this.userName = userName;
  29.     }
  30.    
  31.     public void setEmail(String email) {
  32.         this.email = email;
  33.     }
  34. }

Cualquiera de las 2 formas es correcto, pero la segunda tiene un impacto más profesional "o bueno al menos eso escuche decir", para mi la segunda es como un - "mas trabajo por el mismo precio".

------------------------------------------------------------------------------------------------------

-> continua debajo
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #2 (permalink)  
Antiguo 20/07/2011, 14:00
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 6 meses
Puntos: 188
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

* Ahora crearemos 2 formularios HTML 1 para el ingreso de usuarios y el otro para el registro.

login.jsp
Código java:
Ver original
  1. <%@taglib prefix="t" uri="http://java.sun.com/jsp/jstl/core" %>
  2. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  3. <%-- En caso de que exista una sesion iniciada redirecciono a index.jsp. "NO tiene caso mostrar este formulario cuando hay una sesion iniciada --%>
  4. <t:if test="${sessionScope['sessionEmail']!=null}">
  5.    <% response.sendRedirect("index.jsp");%>
  6. </t:if>
  7. <!DOCTYPE html>
  8. <html>
  9.    <head>
  10.        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  11.        <title>Iniciar sesion</title>
  12.    </head>
  13.    <body>
  14.        <h1>Iniciar sesion</h1>
  15.        <p><a href="register.jsp">Registrarse</a></p>
  16.        <p style="color: #ff0000">${sessionScope['error']}</p>
  17.        <form action="Login" method="post">
  18.            <p> Email: <input type="text" name="email"></p>
  19.            <p> Contraseña: <input type="password" name="password"></p>
  20.            <p><input type="submit" value="Entrar"></p>
  21.        </form>
  22.    </body>
  23. </html>

register.jsp
Código java:
Ver original
  1. <%@taglib prefix="t" uri="http://java.sun.com/jsp/jstl/core" %>
  2. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  3. <%-- En caso de que exista una sesion iniciada redirecciono a index.jsp. "NO tiene caso mostrar este formulario cuando hay una sesion iniciada --%>
  4. <t:if test="${sessionScope['sessionEmail']!=null}">
  5.    <% response.sendRedirect("index.jsp");%>
  6. </t:if>
  7. <!DOCTYPE html>
  8. <html>
  9.    <head>
  10.        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  11.        <title>Registrarse</title>
  12.    </head>
  13.    <body>
  14.        <h1>Iniciar sesion</h1>
  15.        <p><a href="login.jsp">Iniciar Sesion</a></p>
  16.        
  17.        <p style="color: #ff0000">${sessionScope['error']}</p>
  18.        <form action="Register" method="post">
  19.            <p>Nombre: <input type="text" name="name"></p>
  20.            <p>Email: <input type="text" name="email"></p>
  21.            <p>Contraseña: <input type="password" name="password1"></p>
  22.            <p>Confirma contraseña <input type="password" name="password2"></p>
  23.            <p><input type="submit" value="Entrar"></p>
  24.        </form>
  25.    </body>
  26. </html>

En el atributo action de la etiqueta form de ambos formularios vemos el nombre de 2 servlets "Register" y "Login"

Ahora pasaremos a trabajar en la capa de control.

Creando los servlets "Register" y "Login" - Nuevo Paquete llamado "servlets".
Click derecho "sobre le paquete servlets" luego en new --> servlet


Register.java
Código java:
Ver original
  1. package servlets;
  2.  
  3. import beans.*;
  4. import clases.*;
  5. import java.util.regex.*;
  6. import java.io.*;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import javax.servlet.http.HttpSession;
  12.  
  13. public class Register extends HttpServlet {
  14.  
  15.     @Override
  16.     protected void doGet(HttpServletRequest request, HttpServletResponse response)
  17.             throws ServletException, IOException {
  18.         /* En este proyecto; este servlet no recibe ni debe recibir nada por GET,
  19.          * asi que si se lleva a entrar al servelt
  20.          * usando el metodo GET solamente redireccion al index.jsp
  21.          */
  22.         response.sendRedirect("index.jsp");
  23.     }
  24.    
  25.     @Override
  26.     protected void doPost(HttpServletRequest request, HttpServletResponse response)
  27.             throws ServletException, IOException {
  28.         HttpSession respuesta = request.getSession(true);
  29.         PrintWriter out = response.getWriter();
  30.         //Declaro e inicio las variables
  31.         String nombreUsuario = request.getParameter("name");
  32.         String emailUsuario = request.getParameter("email");
  33.         String password = request.getParameter("password1");
  34.         String confirm_password = request.getParameter("password2");
  35.         Pattern p = Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+([a-zA-Z]{2,9}.)+[a-zA-Z]{2,3})$");
  36.         Matcher m = p.matcher(emailUsuario);
  37.         Validador v = new Validador();
  38.         Dao d = new Dao();
  39.         //Comienzo con las validaciones
  40.         /*
  41.          * Podemos hacer un monton de validaciones, por ejemplo:
  42.          * Campos no vacios, direccion de email valida, nombre de usuario y contraseña
  43.          * sin espacios y/o caracteres especiales.
  44.          */
  45.        
  46.         //campos vacios
  47.         if(nombreUsuario.isEmpty() || emailUsuario.isEmpty() || password.isEmpty() || confirm_password.isEmpty()){
  48.             respuesta.setAttribute("error", "Hay campos vacios");
  49.            
  50.         } else {
  51.             //No hay campos vacios, veo que la direccion de email sea válida
  52.             if(m.find()){
  53.                 respuesta.setAttribute("error", "La direccion de email no es correcta");
  54.                
  55.             } else {
  56.                 //La direccion de email si es correcta, verifico que la contraseña tambien lo sea
  57.                 if(v.isUsernameOrPasswordValid(password)){
  58.                     //Ahora verifico si la contraseña 1 y la contraseña 2 son iguales
  59.                     if(password.equals(confirm_password)){
  60.                         try {
  61.                             d.conectar();
  62.                                 if(d.isEmailRegistered(emailUsuario)){
  63.                                     respuesta.setAttribute("error", "Esta direccion de correo ya fue registrada");
  64.                                 } else {
  65.                                    
  66.                                     //Legado a este punto significa que todo esta correcto, por lo tanto ingreso a la DB
  67.                                     d.registerUser(emailUsuario, password, nombreUsuario);
  68.                                     respuesta.setAttribute("error", null);
  69.                                 }
  70.                            
  71.                             d.desconectar();
  72.                              
  73.                         } catch (Exception e) { out.println("Ocurrio la sig exception: " +e); }
  74.                        
  75.                        
  76.                        
  77.                     } else {
  78.                         respuesta.setAttribute("error", "Las contraseñas no son iguales");
  79.                        
  80.                     }
  81.                    
  82.                 } else {
  83.                     respuesta.setAttribute("error", "Contraseña no es válida");
  84.                    
  85.                 }
  86.                
  87.                
  88.             }
  89.         }
  90.        
  91.         response.sendRedirect("register.jsp");
  92.        
  93.     }
  94.  
  95. }

-> continua debajo
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #3 (permalink)  
Antiguo 20/07/2011, 14:00
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 6 meses
Puntos: 188
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

En el Servlet anterior estamos viendo el funcionamento de una Expresión Regular para verificar que una dirección de email sea correcta, tambien surgió la necesidad de verificar que no existan espacios o caracteres especiales en el nombre de usuario y en la contraseña. Para esto podemos hacer uso de otra Expresion Regular, pero como aprendices de programación haremos las cosas por el modo mas largo, asi que crearemos un método para realizar ésta verificacion

He creado un paquete llamado "clases" y dentro de el una Javaclase llamada "Validador.java" que contiene al método isUsernameOrPasswordValid

Código java:
Ver original
  1. public boolean isUsernameOrPasswordValid(String $cadena) {
  2.         char[] cadena = $cadena.toLowerCase().toCharArray();
  3.  
  4.         //Compruebo la longitud
  5.         if (cadena.length <= 6) {
  6.             return false;
  7.         }
  8.         for (int i = 0; i < cadena.length; i++) {
  9.             //Compruebo que no existan caracteres especiales (solamento los que podrian ser usados para una inyeccion SQL o perjudicar en la consulta);
  10.             if (cadena[i] == ' '
  11.                     || cadena[i] == '='
  12.                     || cadena[i] == '?'
  13.                     || cadena[i] == '+'
  14.                     || cadena[i] == '*'
  15.                     || cadena[i] == '-'
  16.                     || cadena[i] == '%'
  17.                     || cadena[i] == '/'
  18.                     || cadena[i] == '.'
  19.                     || cadena[i] == ','
  20.                     || cadena[i] == ';'
  21.                     || cadena[i] == '!'
  22.                     || cadena[i] == '<'
  23.                     || cadena[i] == '>'
  24.                     || cadena[i] == ':') {
  25.                 return false;
  26.             }
  27.  
  28.         }
  29.         return true;
  30.     }


servlet Login.java
Código java:
Ver original
  1. package servlets;
  2.  
  3. import beans.DaoUser;
  4. import clases.Validador;
  5. import java.io.IOException;
  6. import java.util.regex.*;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import javax.servlet.http.HttpSession;
  12.  
  13. public class Login extends HttpServlet {
  14.  
  15.     @Override
  16.     protected void doGet(HttpServletRequest request, HttpServletResponse response)
  17.             throws ServletException, IOException {
  18.         /* En este proyecto; este servlet no recibe ni debe recibir nada por GET,
  19.          * asi que si se lleva a entrar al servelt
  20.          * usando el metodo GET solamente redireccion al index.jsp
  21.          */
  22.         response.sendRedirect("index.jsp");
  23.     }
  24.  
  25.     @Override
  26.     protected void doPost(HttpServletRequest request, HttpServletResponse response)
  27.             throws ServletException, IOException {
  28.         HttpSession respuesta = request.getSession(true);
  29.         String email = request.getParameter("email");
  30.         String password = request.getParameter("password");
  31.         Pattern p = Pattern.compile("^([0-9a-zA-Z]([_.w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+([a-zA-Z]{2,9}.)+[a-zA-Z]{2,3})$");
  32.         Matcher m = p.matcher(email);
  33.         Validador v = new Validador();
  34.         DaoUser d = new DaoUser();
  35.        
  36.         //campos vacios
  37.         if (email.isEmpty() || password.isEmpty()) {
  38.             respuesta.setAttribute("error", "Hay campos vacios");
  39.  
  40.         } else {
  41.             //No hay campos vacios, veo que la direccion de email sea válida
  42.             if (m.find()) {
  43.                 respuesta.setAttribute("error", "La direccion de email no es correcta");
  44.  
  45.             } else {
  46.                 //La direccion de email si es correcta, verifico que la contraseña tambien lo sea
  47.                 if (v.isUsernameOrPasswordValid(password)) {
  48.                         try {
  49.                             d.conectar();
  50.                             if (d.isAcountExists(email, password)) {
  51.                                 //Significa que la cuenta si existe
  52.                                 //OBTENGO EL NOMBRE DEL USUARIO Y LO GUARDO EN UNA SESION
  53.                                 String NombreUsuario = d.getNameByEmail(email);
  54.                                 respuesta.setAttribute("sessionNombre", NombreUsuario);
  55.                                 respuesta.setAttribute("sessionEmail", email);
  56.                                
  57.                             } else {
  58.                                 respuesta.setAttribute("error", "Esta direccion de correo ya fue registrada");
  59.                             }
  60.  
  61.                             d.desconectar();
  62.  
  63.                         } catch (Exception e) {}
  64.  
  65.  
  66.                    
  67.  
  68.                 } else {
  69.                     respuesta.setAttribute("error", "Contraseña no es válida");
  70.  
  71.                 }
  72.  
  73.  
  74.             }
  75.         }
  76.  
  77.         response.sendRedirect("login.jsp");
  78.  
  79.     }
  80. }

Por último falta crear el archivo que invalida las sesiones útil para (Cerrar Sesion), en nuestro ejemplo será un servlet


Logout.java
Código java:
Ver original
  1. package servlets;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10.  
  11. public class Logout extends HttpServlet {
  12.  
  13.     //Ya sea que el método sea por GET o POST, cerraremos la sesion.
  14.     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
  15.             throws ServletException, IOException {
  16.         response.setContentType("text/html;charset=UTF-8");
  17.         PrintWriter out = response.getWriter();
  18.         HttpSession sesion = request.getSession(true);
  19.        
  20.         //Cerrar sesion
  21.         sesion.invalidate();
  22.        
  23.         //Redirecciono a index.jsp
  24.         response.sendRedirect("index.jsp");
  25.     }
  26.  
  27.     @Override
  28.     protected void doGet(HttpServletRequest request, HttpServletResponse response)
  29.             throws ServletException, IOException {
  30.         processRequest(request, response);
  31.     }
  32.  
  33.     @Override
  34.     protected void doPost(HttpServletRequest request, HttpServletResponse response)
  35.             throws ServletException, IOException {
  36.         processRequest(request, response);
  37.     }
  38. }

------------------------------------------------------------------------------------------------------------------------------------------------------------------

Conclusión. Hemos visto que la programación esta separada por capas.

* La capas de presentacion son los archivos JSP, no tienen código Java explicito si no que usan Expression Language.
* Las capas de control son los servlets.
* Las capas de datos son los beans (Archivos que nosotros llamamos Dao). Dao son las siglas de Data Access Object de ahi el nombre.

En una programación orientada a objetos, el orden en el que programemos dará como resultado el tiempo en que lo programemos.

RECOMENDACIÓN: Por eso es que siempre es recomendable plantear el problema antes de comenzar a codificar usando lapiz y papel para identificar los objetos/clases y sus métodos.

Por ello, una de las cosas que en éste tutorial hicimos al comienzo fue crear todos los métodos necesarios.

Espero que a más de uno les sirva este material.
Les mando un saludo.

Éxitos.
---------------------------------------------------------------------------------------------
Descarga el Proyecto completo + archivo SQL: http://www.megaupload.com/?d=ZVW8BMEH
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #4 (permalink)  
Antiguo 21/07/2011, 13:21
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Está bien, sólo te pondría dos pegas

El método isUsernameOrPasswordValid.

Deberías haber usado un regex, no ese tochazo de condición. Fíjate en como compruebas el mail, ahí se está usando un regex.

DaoUser2

Efectivamente es más profesional, pero no como tú la has hecho. La forma "profesional" sería haber creado un DAO con sus getters y setters (un bean), y un DTO que es el que se encarga de ejecutar las consultas. Tú has mezclado los dos en uno.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 21/07/2011, 14:24
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 6 meses
Puntos: 188
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Gracias por las recomendaciones.

Si sobre el Regex efectivamente ya lo sabía y tambien lo dije en el tuto, bueno al menos creo que no olvide escribirlo.

Pero el arrendo tochazo de condicional que usé esta justificado.

Fijate:

Como estudiantes del nivel básico en Java no nos dejan utilizar expresiones regulares, frameworks, entre otras cosas que nos facilitan el trabajo si no que desean que aprendamos a resolver los problemas por nuestros propios métodos, para ponernos a pensar y todo eso, creo que hay mucha razon en esta idea.

Gracias por las recomendaciones, sobre lo la mezcla no lo entiendo me ayudas con un ejemplo para comprender y aprender y tener en cuenta esta debilidad.


Saludos.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #6 (permalink)  
Antiguo 22/07/2011, 02:54
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Bueno, realmente el uso que te propongo (String.matches) no lo considero avanzado, y como sí utilizaste patrones para el email (eso sí es más avanzado) , pues pensé en comentarlo. Pero bueno, para alguien que está aprendiendo sí es más claro como tu dices.

http://download.oracle.com/javase/1,...lang.String%29


Sobre lo otro, lo que te comenté es el patrón básico.

Con los datos que sacas/metes en la BBDD haces objetos tipo bean, que serían los DAO, con los mismos atributos que campos tienes en la BBDD, más o menos. Las consultas las pones en un objeto DTO, por ejemplo todas las relacionadas con User. Cuando haces una consulta, pasas los resultados a su DAO o lista de DAOs.

Es lo que tendrás que usar con frameworks de persistencia como Hibernate, Ibatis/MyIbatis...

Yo tenía un link en algún sitio a un tutorial que no estaba mal, pero ahora no lo encuentro. De todas formas en el foro, podrás ver muchos ejemplos de gente que pregunta.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 22/07/2011, 15:39
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Hola:

Antes q todo aplaudo el hecho de q te hayas tomado el tiempo y esfuerzo para crear este tutorial.

Pero es necesario hacer algunas acotaciones:
Crear sentencias SQL mediante concatenación de Strings es siempre una mala práctica. Si ya estas usando PreparedStatemen deberías utilizar las funciones
.setInt(...)
.setString(...)
.setXxx(...)
de esa clase para insertar valores dentro de la sentencia sql. Es muy fácil cometer errores al intentar 'sanear' los parámetros por tí mismo.

Por ejemplo, función isUsernameOrPasswordValid q has programado no es suficiente para proteger contra SQL injection.

Otra sugerencia es no guardar los passwords en texto plano en la BD, sino un hash de ellos.

Para programar un sistema de logins (aunque sea básico) hay q tener en cuenta muchos detalles. Es por eso q lo usual es q se use algún framework o api que haga ese trabajo por tí.

saludos;

Nup_
  #8 (permalink)  
Antiguo 22/07/2011, 15:49
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Hombre nup_, que es un tutorial básico, si empezamos a preocuparnos de la seguridad, tenemos al pobre escribiendo durante días.



Yo lo del DAO lo comenté por lo que decía de que le parecía escribir código innecesario.

Por cierto New, ya encontré el link, el problema es que parece que ahora hay que registrarse para poder leerlo.

http://www.ingeniosarrieta.com/2010/...-paso-i-parte/
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #9 (permalink)  
Antiguo 26/07/2011, 20:06
 
Fecha de Ingreso: junio-2010
Ubicación: Ehhh... ¿Alguien podría decirme donde me encuentro o_O???
Mensajes: 39
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Ufff... Con esto, puedo adaptarlo a un proyecto que estoy haciendo actualmente.

Gracias New por el aporte que has hecho, es una guia muy útil...
  #10 (permalink)  
Antiguo 27/07/2011, 15:48
 
Fecha de Ingreso: julio-2011
Mensajes: 11
Antigüedad: 12 años, 8 meses
Puntos: 4
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Para agradecerte todo el esfuerzo que hiciste en este tutorial, quedo muy bien. Saludos y gracias.
  #11 (permalink)  
Antiguo 27/07/2011, 16:04
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 6 meses
Puntos: 188
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Con mucho gusto, y gracias que bueno que te sirvio. Un saludo.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #12 (permalink)  
Antiguo 27/07/2011, 20:09
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Este es el problema q me temía:
Cita:
Iniciado por raptor_yimm Ver Mensaje
Ufff... Con esto, puedo adaptarlo a un proyecto que estoy haciendo actualmente.
Aunque ese tutorial sirve como ejercicio para entender algunos conceptos, NO debe ser usado en una aplicación en producción.

raptor_yimm, te aconsejo utilices algunas de los frameworks de seguridad q ya existen y llevan años probados. Ejemplo:
Spring Security (http://static.springsource.org/spring-security/site/)
Apache Shiro (http://shiro.apache.org/)


saludos;

Nup_
  #13 (permalink)  
Antiguo 02/05/2012, 05:03
 
Fecha de Ingreso: abril-2012
Mensajes: 1
Antigüedad: 12 años
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Hola,

He estado probando el codigo que has puesto y la clase "Validador" me da el siguiente error: "class, interface or enum expected" y no se que he podido hacer mal...¿alguna idea?
  #14 (permalink)  
Antiguo 02/05/2012, 11:22
 
Fecha de Ingreso: abril-2012
Mensajes: 12
Antigüedad: 12 años
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Hola me gustaría si esta en las manos de alguien conocer si es necesario implementar en java la clase sessionfactory que resulta ser una interface para poder acceder a una base de datos.

Cuando se realiza el mapeo por hibernate es importante trabajar con sessiones pero cuando compilo no me apunta a ningun lugar y me fije que se trata de un método que debe ser implementado. Mi pregunta

Se debe implementar esos métodos para utilizarlos o es que para una aplicación de escritorio o destopk no es funcional realmente necesito ayuda no he podido conectarme a mi base de datos
gracias
  #15 (permalink)  
Antiguo 19/06/2012, 08:12
 
Fecha de Ingreso: junio-2012
Mensajes: 1
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Iovan excelente la explicacion, lo que si no pude descargar el proyecto porque esta caido el enlace, si podes subilo de nuevo. Gracias!
  #16 (permalink)  
Antiguo 19/06/2012, 11:32
Avatar de caruizj  
Fecha de Ingreso: marzo-2012
Ubicación: Málaga
Mensajes: 161
Antigüedad: 12 años, 1 mes
Puntos: 14
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Cita:
Iniciado por renzo_1289 Ver Mensaje
Iovan excelente la explicacion, lo que si no pude descargar el proyecto porque esta caido el enlace, si podes subilo de nuevo. Gracias!
Jaja, no está caido el enlace, lo que chaparon es Megaupload! ¡en qué mundo vives! Espero que te pasen el enlace, sino podría hacerte yo un tutorial en mi página, un saludo.
__________________
Aprendiendo un poco de Java :D
  #17 (permalink)  
Antiguo 23/06/2012, 15:41
 
Fecha de Ingreso: junio-2012
Ubicación: Punta arenas
Mensajes: 2
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

alguien alcanzo a bajar el proyecto completo ? lo necesito urgente por favor si pueden me lo envian a [email protected]

muchas gracias ^^
  #18 (permalink)  
Antiguo 23/06/2012, 15:50
 
Fecha de Ingreso: junio-2012
Ubicación: Punta arenas
Mensajes: 2
Antigüedad: 11 años, 9 meses
Puntos: 0
Pregunta Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

alguien alcanzo a bajar el proyecto completo ? lo necesito urgente por favor si pueden me lo envian a [email protected]

muchas gracias ^^
  #19 (permalink)  
Antiguo 25/06/2012, 18:39
 
Fecha de Ingreso: junio-2012
Mensajes: 6
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Hola a todos yo soy un personaje, como todos ustedes echado pa lante

con ganas de ganar batallas, a

felicito a cada uno de los que aportaron ideas en el presente foro, en verdad les

digo que si, buenos apuntes... todo acerca de programar aplicaciones web de tipo mvc.





ahora les voy a plantear si me lo permiten una nueva situacion relativa con la implementacion de servidores web, como jboss o tomcat coyote server....

ya que el correcaminos jboss. me ha jugado una mala pasada como le pasa al coyote, dato que cito a continuación:


dato que arroja la consola del servidor de jboss 7.1 cuando inicia la ejecución del servidor
-----------------------------------------------------------------------------------------------
18:40:19,140 ERROR [org.jboss.as.server] JBAS015956: Caught exception during boot: org.jboss.as.controller.persistence.ConfigurationP ersistenceException: JBAS014676: Failed to parse configuration
at org.jboss.as.controller.persistence.XmlConfigurati onPersister.load(XmlConfigurationPersister.java:14 1) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.ServerService.boot(ServerServi ce.java:266) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.controller.AbstractControllerService$ 1.run(AbstractControllerService.java:155) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0]
Caused by: com.ctc.wstx.exc.WstxParsingException: Illegal processing instruction target ("xml"); xml (case insensitive) is reserved by the specs.
at [row,col {unknown-source}]: [1,6]
at com.ctc.wstx.sr.StreamScanner.constructWfcExceptio n(StreamScanner.java:606)
at com.ctc.wstx.sr.StreamScanner.throwParseError(Stre amScanner.java:479)
at com.ctc.wstx.sr.BasicStreamReader.readPIPrimary(Ba sicStreamReader.java:3891)
at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(B asicStreamReader.java:2025)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStream Reader.java:1102)
at com.ctc.wstx.sr.BasicStreamReader.nextTag(BasicStr eamReader.java:1125)
at org.jboss.staxmapper.XMLMapperImpl.parseDocument(X MLMapperImpl.java:67) [staxmapper-1.1.0.Final.jar:1.1.0.Final]
at org.jboss.as.controller.persistence.XmlConfigurati onPersister.load(XmlConfigurationPersister.java:13 3) [jboss-as-controller-7.1.1.Final.jar:7.1.1.Final]
... 3 more

18:40:19,171 FATAL [org.jboss.as.server] JBAS015957: Server boot has failed in an unrecoverable manner; exiting. See previous messages for details.
18:40:19,218 INFO [org.jboss.as] JBAS015950: JBoss AS 7.1.1.Final "Brontes" stopped in 7ms




Compañeros les agradezco su colaboración, y recuerden que aqui estamos pa programar exitos, solidificar conocimientos, y por supuesto trabajar en equipo.

Gracias!

Duban Torres.
Hack_trick_tower
  #20 (permalink)  
Antiguo 25/11/2012, 12:10
 
Fecha de Ingreso: noviembre-2012
Mensajes: 1
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

amigo podrias mandarme o subir el proyecto a otro servidor porfavor
  #21 (permalink)  
Antiguo 20/12/2012, 18:49
 
Fecha de Ingreso: octubre-2012
Ubicación: Bogotá
Mensajes: 40
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Cita:
Iniciado por Xerelo Ver Mensaje
Está bien, sólo te pondría dos pegas

El método isUsernameOrPasswordValid.

Deberías haber usado un regex, no ese tochazo de condición. Fíjate en como compruebas el mail, ahí se está usando un regex.

DaoUser2

Efectivamente es más profesional, pero no como tú la has hecho. La forma "profesional" sería haber creado un DAO con sus getters y setters (un bean), y un DTO que es el que se encarga de ejecutar las consultas. Tú has mezclado los dos en uno.
Totalmente de acuerdo, pero cabe clarar que DAO son las operaciones, Y El DTO es la que trae métodos get y set
  #22 (permalink)  
Antiguo 21/12/2012, 22:14
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 6 meses
Puntos: 188
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

El tochazo de código no es profesional ni pretende serlo, es escolar como ya dije jeje me alegra que despues de tanto tiempo siga vivo el post. Espero que les haya servido, en resumidas cuentas en java básico para perderle miedo al maravilloso mundo de poo, saludos y gracias por visitar el tema :D


Felices fiestas, coman mucho y engorden felices como yo jejeje
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #23 (permalink)  
Antiguo 29/12/2012, 20:59
 
Fecha de Ingreso: marzo-2012
Mensajes: 2
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

Man yo quisiera que al momento de logueo me reconozca el tipo de usuario y que me mande a diferentes menus, por ejemplo: Si se loguea un alumno que vaya al menu de alumno y si se logea un maestro que vaya al jsp del maestro. Todo esto usando jsp, servlet, tomcat y mysql
  #24 (permalink)  
Antiguo 20/03/2013, 19:36
 
Fecha de Ingreso: marzo-2013
Mensajes: 1
Antigüedad: 11 años
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

parce estuve haciendo tu ejemplo pero no me funciona me sale:

Estado HTTP 404 -

--------------------------------------------------------------------------------

type Informe de estado

mensaje

descripción El recurso requerido no está disponible.


--------------------------------------------------------------------------------

Apache Tomcat/6.0.36

esto a q se debe? si sabes algo y me podes ayudar te lo agradeceria ;)
  #25 (permalink)  
Antiguo 29/03/2015, 13:05
 
Fecha de Ingreso: marzo-2015
Mensajes: 4
Antigüedad: 9 años
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

yo tengo un problema similar, sucede que yo he creado una aplicacion web y me funciona bien en glassfish pero cuando alojo dicha aplicacion en mi dominio no se donde alojar la clase que contiene la accion del formulario

<form action="Acceder" id="form" method="post">
  #26 (permalink)  
Antiguo 29/03/2015, 13:06
 
Fecha de Ingreso: marzo-2015
Mensajes: 4
Antigüedad: 9 años
Puntos: 0
Respuesta: [Aporte] Registro y Login de usuarios con JSP,SERVLETS,MySQL

yo tengo un problema similar, sucede que yo he creado una aplicacion web y me funciona bien en glassfish pero cuando alojo dicha aplicacion en mi dominio no se donde alojar la clase que contiene la accion del formulario

<form action="Acceder" id="form" method="post">

Etiquetas: jsp, jsp-servlets, login, registro, servlet, string, usuarios, https
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 6 personas




La zona horaria es GMT -6. Ahora son las 17:18.