jueves, 28 de octubre de 2010

Login con sesiones JSP y MYSQL

Bien hace poco pidieron por ahi un login con jsp y mysql , tambien uno con access pero ese mas adelante lo hare , por hoy tengo este en mysql , viene validado con javascript , con sesiones para que de una vez las apliquemos.

Bien para empezar el login nos va servir para la seguridad de nuestra aplicacion , tambien para tener distintos usuarios dentro de nuestro , sistema yo siempre recomiendo si no es tan relevante el tipo de usuario podemos crear tablas diferente tales como administradores , usuarios etc.

Las sesiones son mas seguras que las cookies , ya que las sesiones se guardan en el servidor y no el cliente , aunque las cookies tambien son utiles.

Bien empezemos con el login , haremos un formulario tal y como se muestra en la imagen.

Este formulario esta validado con javascript a manera que no quede en blanco los objetos html , cuando los datos esten llenos se mandan al servidor para que otro archivo sirva de pasarela y verifique la informacion de la base de datos.


Bien antes que todo tenes que conectar a la base como ya hemos visto antes , luego declaramos una variable booleana para jugar al true o false , dependiendo si los datos son correctos , luego capturamos los objetos html del formulario anterior , luego hacemos un select * from a la tabla user con un where , y abrimos un while para obtener todos los datos , y comparamos si son identicos a los que acaban de introducir .


Luego de cerrar el ciclo while , hacemos un if para verificar si la informacion es correcta , si son correctos , luego creamos la sesion y le asignamos un nombre y un valor.

Luego mostramos un mensaje que se identifico correctamente y redireccionamos a la pagina protegida, si los datos son incorrectos muestra un mensaje de error y regresa al login .

Cabe recordar que tenes que importar las java util y poner las session=true .

Bien esta es la pagina protegida ya que las sesiones para esos sirven para que el contenido de la pagina sea solo visible a los usuarios registrados.

Primero tenemos que capturar el nombre de la sesion y guardarla en un objeto string , luego hacemos un if si el user es diferente de null osea nada , que me muestre todo lo protegido , todo el contenido de la web que es solo para usuarios registrados.

cuando terminemos de poner todo el html o codigo java tenemos que cerrar el if para luego abrir el else , que es cuando el usuario no se ha logeado saldra una imagen que diga usuario no registrado.

veamos una demostracion de lo que les hablo primero estaremos con un usuario debidamente logeado y registrado en nuestra base de datos lo que mostrara es esto:

Si el usuario se logeo perfectamente le mostramos el contenido solo para usuarios registrados.
si el usuario llega de bayunco y le pide la url privada a otro tipo que es registrado o simplemente empieza a probar las paginas , la sesion le bloqueara el contenido asi .

Nuevo enlace

Sean agradecidos con el codigo , compartanlo mejorenlo pero nunca se olviden de donde lo bajaron.

59 comentarios:

  1. Grande hermano lo estaba buscando desde hace tiempo...muchas gracias por tus aportes son de mucha ayuda

    ResponderEliminar
  2. Hey ta weno el ejemplo !!! Grax

    ResponderEliminar
  3. Enlace arreglado cualquier onda comenten

    ResponderEliminar
  4. Men quedo a todo dar, si me sale solo la imagen no, pero eso es lo de menos , te ganaste un 10 vientos a compartir el codigo y gracias por tomarte el tiempo saludos desde Hidalgo, Mexico.
    mi correo cilox54@hotmail.com

    ResponderEliminar
  5. Gracias pero ya saben que estamos para ayudar, y saludos desde el Salvador.

    ResponderEliminar
  6. mi hermano como le hago para consultar una lista de calificaciones bueno el problema es para poder presentarla en la pagina web, Por ejemplo, materia, calificación 1, cali2, cali3, promedio. y asi de varias materias que este cursando en un semestre, los relaciono por medio de un id en mis tablas. saludos gracias

    ResponderEliminar
  7. ese reporte va depender de como tengas tu base de datos la idea te entiendo necesitas presentar calificaciones por materias, solo que son varias calificaciones , pero esa materia debe de tener un alumno asi que podrias poner mas informacion sobre la base de datos , ya que te podria decir que mostraras primero al alumno con sus materias que esta cursando luego en cada materia poner un enlace y que lleve el id de la materia por metodo get , para luego mostrar todas las calificaciones de esa materia.

    ResponderEliminar
  8. hey rada me da problemas el codigo q ondas ahi

    ResponderEliminar
  9. Hola, gracias por tu aporte pero tengo una duda, la sesión inicia obviamente al principio y me valida para poder acceder al menu, pero como le hago para que me respete a ese usuario en el resto de las paginas de mi programa, que código les pongo o como voy arrastrando la sesión entre mis servlets, lo que pasa es que quiero ponerle permisos a mis usuarios. Gracias.

    ResponderEliminar
  10. ok muy buena tu pregunta y es algo que se puede mejorar con este ejemplo que esta en el blog.

    bien el primer punto la sesion inicia cuando el usuario es correctamente validado , osea cuando el usuario esta en la base de datos,ahora la sesion se guarda en el servidor hasta cuando tu lo desees podes ponerle un tiempo prudente de existencia a la sesion digamos unos 15 minutos en el cual obligas al usuario a logearse de nuevo.

    con el segundo punto para validar al usuario en todas tus paginas solo debes de hacer un if si existe esa sesion , ya si quiere darle permisos lo puedes hacer de muchas maneras diferentes una creando otra sesion con los permisos de se usuario la otra que se me ocurre es cuando verifiques q existe hacer una consulta a traer esos permisos y validarlos con los correspondientes .

    espero te sirva cualquier duda pues aca estamos.

    ResponderEliminar
  11. no puedo descargar el archivo...me sale un error

    ResponderEliminar
  12. el enlace esta en perfectas condiciones para que lo bajes sin ningun problema.

    ResponderEliminar
  13. Muchisisimas Gracias men iras al cielo de Programacion . . . .Se te agradece :D

    ResponderEliminar
  14. Muy muy buen aportee mannn Graciiaassss . . . .

    ResponderEliminar
  15. que buena socio era justo lo que necesitaba

    ResponderEliminar
  16. Arigatou! O gracias! Oh!! me has ayudado!

    ResponderEliminar
  17. Gracias amigo, me sacaste de una gran duda que tenía respecto a las sesiones.

    ResponderEliminar
  18. donde se coloca el archivo "localhost.sql"???

    ResponderEliminar
  19. El archivo localhost.sql ademas de contener la definicion de la base de datos lo puede ejecutar desde el servidor de mysql como tiene extencion .sql recuerdo que es importar luego te pide que subas un archivo con varias extenciones las cuales son varias y esta .sql una vez subido dale aceptar y el generara la base de datos.

    la otra opcion es copiar el codigo que contiene el archivo y correr solo el sql las informacion de cabecera que contiene espero me haya explicado.

    ResponderEliminar
  20. HOla para que ocupas las librerias de hibernate?

    ResponderEliminar
  21. Las librerias de hibernate en este proyecto se colaron cuando se creo el proyecto,se las puedes quitar y no abra problema,no se ocupan para nada ya que no se usa este ORM.

    ResponderEliminar
  22. hola gracias por tu ejemplo espero que sigas subiendo mas información interesante

    att: maria camila

    ResponderEliminar
  23. hola gracias por el aporte tengo una duda lo kq pasa es ke voy a acer un sistema ke necesita privilegios de usuario si es administrador o si es un usuario normal como podria modificarlo ya que soy nuevo en esto de netbeans de antemano muchas gracaias.

    ResponderEliminar
  24. para diferenciar si es usuario normal o otro tipo de usuario en la misma tabla de usuarios indicale que es,luego guardalo en sesion,y a lo largo de tu sistema evalua si tiene los permisos para hacer X accion, es una forma hay muchas desde permisos desde un XML pero esto se usa cuando se quiere un nivel de personalizacion mas grande pero si solo quieres usuario normal o administrador puedes hacer lo anterior agarrando la idea

    ResponderEliminar
  25. esta genial tu blog amigo,creo que eres muy bueno en java espero y puedas ayudarme por favor, ya que estoy desarrollando una pequeña aplicación en netbeans, mira mi problema es que en una bd de mysql almaceno una foto y deseo recuperar la a través de un jcslide, ya logre conectar el slide a la bd pero cuando hago el filtro solo me realiza una busque y solo me muestra el primer resultado que encuntra cuanto en realidad tengo varias fotos con el mismo nombre, de antemano gracias. espero y puedas ayudarme

    ResponderEliminar
  26. Bueno ya lograste conectar a la bd y supongo que ya se visualiza la imagen que traes desde la base ,el jcslide es un componente que hizo algun tercero ya que no lo trae swing,ahi el problema puede ser tu consulta sql probala desde mysql con valores que quieras que regreses si te devuelve lo que quieres entonces es de buscar en tu codigo java donde estara el error ,sino ese componente tendra algun Bug.

    ResponderEliminar
  27. antes que nada gracias por respoder, y si ya cheque la consulta y creo q esta bien mira: "SELECT foto from tImagenes where carnet = ?;
    el ? es donde espera el parámetro que introduzca el usuario no.
    pero si gustas te puedo enviar el código para que lo revises.

    ResponderEliminar
  28. "SELECT foto from tImagenes where carnet = ?" el carnet puede traer muchas imagenes? o solo hay una imagen por carnet? el primer comentario entendi que hacias la consulta para que devolviera un conjunto de datos,si ya probaste esa consulta en mysql y te devulver lo que quieres,es hora de irte a tu codigo java debugealo,puede ser ese componente que estas usando o tiene bug o lo estas implementando de una forma incorrecta.

    ResponderEliminar
  29. si mira me explico, el usuario va poder realizar búsquedas de las imágenes a través de diversos capos uno de esos es el carnet por decir, como anteriormente te mencione lo importante no es recuperar los demás datos de mi bd lo que me interesa es la img, lo realice por medio de paneles pero el problema que tengo que a través del panel solo puedes presentar una img y si tuvieras mas de una con el mismo carnet solo te presenta la primera q encuentra en la bd y no las de mas, por eso pensé que si usaba un jcslide podría presentarme todas sin ningún problema, pero cuando realizo la búsqueda con la sentencia anterior obtengo el mismo resultado solo me muestra una img, te dejo mi correo e_red_in@hotmail.com porque en realidad me gustaría poder desarrollar esta aplicación y gracias por tu interés carnal. espero me hallas en tendido,jajaja

    ResponderEliminar
  30. bueno tu aplicacion lo que quiere hacer es por unos filros traer datos de la base en esos datos vienen las imagenes que estan asociadas a los parametros de busqueda,si ya salimos de la duda que tu consulta esta bien vamonos a Java,bien el jcslide deberia de mostrarlas todas las imagenes,pero parece q no lo hace,bien nos vamos a la idea de tus paneles que solo te muestra una"ya verificaste que en java te traiga los datos exactos que quieres deberia de traer el conjunto"si es asi es porque en tu interfaz grafica o vista lo estas implementando mal.

    una idea que se viene es que hagas un tipo carrusel que pagines esos registros y muestres solo una pero que des la opcion de recorrer las imagenes existentes y el usuario las ira viendo una por una,ya que te da problemas en mostrarlas todas.

    ResponderEliminar
  31. Lo siento lo borre por error pero aca esta tu comentario

    comentario anterior_____"exacto esa era una de las soluciones que había pensado, pero ya que soy relativamente nuevo en la programación en java netbeans, no creo tener el suficiente conocimiento para poder desarrollarlo no se como programar ese botón que haga que al dar clic sobre el pasen las imágenes y poner en un label 1 de 6 para que sepa cuantas img hay, así que te agradecería mucho cualquier ayuda que puedas brindarme Radamanthys17."____

    ResponderEliminar
  32. aca vamos a usar la logica de una paginacion en tu caso necesitas saber cuantos registros tiene ese carnet eso se hace con un select count te devuelve un valor entero con una consulta lo puedes verificar preguntandole a google.

    Cuando sepas cuantos vas a mostrar lo unico que debes hacer es poner dos botones uno que diga siguiente y anterior.aca hay reglas de validacion no puedes ir al anterior cuantos estas en el primero,no puedes ir al siguiente cuando estas en el ultimo,y el boton de siguiente se encargara de en incrementar en uno la consulta con max result y first result en mysql, el de anterior hara lo contrario le quitara uno al valor estatico que manejes como es aplicativo de escritorio no hay problema que uses valores estaticos.

    ResponderEliminar
  33. Gracias Hermano realmente me fuiste de gran ayuda, no sabia usar sesiones pero ahora con lo que me diste es mas que suficiente. Gracias de nuevo de antemano.

    ResponderEliminar
  34. disculpa quisiera saber si es necesario poner un captcha ala hora de iniciar sesión

    ResponderEliminar
  35. la seguridad depende de la aplicacion,este ejemplo es muy basico solo para empesar en estas cuestiones,si tu sistema requiere de colocar un captcha lo pones,sino no algunos sitios no lo necesitan si ves hotmail,gmail.yahoo no lo implementan.

    Pero como te repito su tu sistema requiere un nivel mas alto de seguridad pues hay que implementar otras cuestiones.

    ResponderEliminar
  36. antes que nada te agradesco tu respuesta, y quisiera saber si no sabes algo de como eliminar un softbot de tu servidor ya que en donde estoy realizando mi servicio socail, el servidor tomo un softbot o robot que ase que cuando guardamos un formulario de alabase de datos mete mucha basura y quisiera saber si lo puedo elimnar.

    ResponderEliminar
  37. de eliminarlo se ha de poder mas que todo desactivarlo pero como veo que es tu servicio social es mejor no tocar esas cuestiones,lo mas logico seria investigar como desactivarlo o sino validar esa basura desde tu aplicacion.

    ResponderEliminar
  38. disculpa la molestia y hoja la puedas ayudarme realice una pequeña aplicación en netbeans es una aplicacion web con jsp, la pagina muestra un contenido, pero esos contenidos se encuentran en una bd de mysql y hago la conexion pormedio de un servlet en el index.jsp mando a llamar los registros de mi tabla y los almaceno en una matriz y final mente los imprimo en una variable dentro del codigo html. en mi lap funciona perfecto pero al subirlo al servidor en un war marca un error, ya cheque la conexion y esta bien la contraseña y el usuario ala bd y las tablas que uso para la pagina estan tambien en la bd y marca este error ojala pudieras ayudarme te lo agradeceria mucho.
    Error:
    Estado HTTP 500 -
    ________________________________________
    type Informe de Excepción
    mensaje
    descripción El servidor encontró un error interno () que hizo que no pudiera rellenar este requerimiento.
    excepción
    org.apache.jasper.JasperException: java.lang.NullPointerException
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:491)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    causa raíz
    java.lang.NullPointerException
    org.apache.jsp.index_jsp._jspService(index_jsp.java:130)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    nota La traza completa de la causa de este error se encuentra en los archivos de diario de Apache Tomcat/6.0.28.
    ________________________________________
    Apache Tomcat/6.0.28

    ResponderEliminar
  39. bueno cuando te lanza esta excepcion java.lang.NullPointerException significa que algo que vas a usar en tu codigo esta nulo,puede ser tu matriz,para recoleccion de datos de la base de datos noce xq estas usando una matriz,en Java hay un framework de colecciones en la cual puedes usar listas y set para hacerlo de una forma mas elegante y legible.

    tambien revisa si todos los jar externos que usas estan localizados en tu web-inf en una carpeta lib ahi pones tus jar externos en casos de usar.

    que servidor de aplicaciones estas usando????en pruebas de desarrollo y en produccion????

    ResponderEliminar
  40. GRACIAS POR RESPODER AMIGO CREO QUE EL ERROR ESTABA EN QUE MI CONECTOR DE MYSQL ESTABA FUERA DE ESA CARPETA, ADEMAS DE UN PEQUEÑO ERROR EN MI WEB.XML

    ResponderEliminar
    Respuestas
    1. Gracias por compartir la solucion a mas de alguno le servira

      Eliminar
  41. te pasaste muxas gracias creeme k me sirvio demaciado!!
    Saludos!!

    ResponderEliminar
  42. quisiera saber como trabajar con calendarios en jsp para ingresar fechas a un formulario?

    ResponderEliminar
    Respuestas
    1. http://vacilmio.blogspot.com/2010/11/calendarios-en-ajax-y-manejo-de-fechas.html

      ahi tienes un ejemplo de un calendario basico y manejo de fechas desde java.El ejemplo es muy simple.Puedes buscar maneras mas optimas para hacerlo como por ejemplo integrar Jquery con JSP, o incluso usar JSF con JSP ahi ya hay componentes de calendarios muy bien hechos.

      Eliminar
  43. que tal amigo ojala y puedas ayudarme mi problema es que dentro de mi jsp tengo que comparar dos variables de tipo string por decir tengo un if que dice si var1 != var2 pasa y aselo lo que quiero se su ponone, pero el problema es que no me lo respeta a veses son iguales los valores de las 2 varibles y an un asi lo ase no se porque cuando se supone que ni deveria entrar al IF.

    los valores de las variables lo recupero de unos inputs anteriores de otro jsp, acontinuacion te pongo mi codigo.

    codigo:
    String nombre = request.getParameter("nombre");
    String nombre2 = request.getParameter("nombre2");

    if (nombre != nombre2) {
    //agragando a la tabla visitas en el campo operacion que el nombre fue cambiado
    String sql5 = "update visitas set operacion='cambio el nombre:" + nombre2 + " por " + nombre + " de su cuenta' where persona='" + rfc2 + "' and fechent='" + fecha + "' and horaent='" + hora + "'";
    conexion7.ExecuteUpdate(sql5);

    } else if (usuario != usuario2) {
    //agragando a la tabla visitas en el campo operacion que el usuario fue cambiado
    String sql6 = "update visitas set operacion='cambio el usuario:" + usuario2 + " por " + usuario + " de su cuenta' where persona='" + rfc2 + "' and fechent='" + fecha + "' and horaent='" + hora + "'";
    conexion7.ExecuteUpdate(sql6);

    } else if (psw != psw2) {
    //agragando a la tabla visitas en el campo operacion que el psw fue cambiado
    String sql7 = "update visitas set operacion='cambio el password:" + psw2 + " por " + psw + " de su cuenta' where persona='" + rfc2 + "' and fechent='" + fecha + "' and horaent='" + hora + "'";
    conexion7.ExecuteUpdate(sql7);

    }

    ResponderEliminar
    Respuestas
    1. compañero en java para comparar cadenas no se usa el signo = ni diferente que !=

      para comparar cadenas que si importe que lleve mayusculas usas el metodo de la clase String equal().

      String h1 = "hola";
      String h2 = "HoLa";


      if(h1.equals(h2)){
      System.out.println("son iguales");
      }else{
      System.out.println(" no son iguales");
      }
      la salida sera no son iguales xq hola no es igual a HoLa.

      si quieres comparar sin importar que esten en mayusculas sino por el contenido de la cadena se usa equalsIgnoreCase

      String h1 = "hola";
      String h2 = "HoLa";


      if(h1.equalsIgnoreCase(h2)){
      System.out.println("son iguales");
      }else{
      System.out.println(" no son iguales");
      }
      aca la salida sera son iguales esa es la solucion al problema que tienes.

      Eliminar
  44. ok. muchas gracias y si tenias razón de esa manera funciono bien, muchas gracias por responder.

    ResponderEliminar
  45. disculpa me gustaria saber si hay alguna forma mas facil de aser las combinaciones por decir si tengo 7 valores ejemplo: a,b,c,d,e,f y g.
    las combinaciones con las letras a serian de 30 por decir no y asi para las demás letras en toces en el código por con secuencia tendría que usar muchas if y else y seria muy tedioso programar cada una de las combinaciones no crees por ese me gustaría saber si hay alguna mas fácil de aser eso ojala me entiendas lo que trato de explicar.

    ResponderEliminar
    Respuestas
    1. codigo hecho no tengo pero para esto puedes ayudarte de alguna formula matematica para obtener las combinaciones posibles y aplicarlo en java.

      Eliminar
    2. Corrigiendo lo anterior las combinaciones es el numero posible por ejemplo de 5 numeros hay 120 combinaciones si no estoy equivocado.

      lo que necesitas hacer es una clase que permute buscando en internet encontre un pedazo de codigo que te puede ayudar hace uso de una LinkedList, lo que permite que se agreguen o eliminen elementos en la lista al inicio o al final.

      Y el metodo lo hace recursivamente hasta llegar al final de las combinaciones chekeate el codigo ojala solucione tu problema.
      import java.util.LinkedList;
      public class NewClass1 {
      public static void main(String[] arg) {
      LinkedList conjunto =new LinkedList();
      conjunto.add('a');
      conjunto.add('b');
      conjunto.add('c');
      conjunto.add('d');
      conjunto.add('e');
      conjunto.add('f');
      conjunto.add('g');
      Permuta ("", conjunto);
      }
      public static void Permuta(String a, LinkedList conjunto) {
      if (conjunto.size()==1) {
      System.out.println(a+conjunto.get(0));
      }
      for (int i=0;i<conjunto.size();i++) {
      Character b = conjunto.remove(i);
      Permuta (a+b, conjunto);
      conjunto.add(i,b);
      }
      }
      }

      Eliminar
  46. ok gracias lo revisare, veré si lo puede adaptar a lo que necesito y te agradezco mucho el interés.

    ResponderEliminar
  47. Gracias es de mucha ayuda

    ResponderEliminar
  48. Muchas gracias, me sirvió al 100%

    ResponderEliminar
  49. Gracias por el ejemplo ta buenazo....................gracias :)

    ResponderEliminar
  50. Gracias amigos
    eres muy bueno felicidades.

    ResponderEliminar