Jsp y sesiones.. Ayuda

Tengo unas páginas jsp p a las que solo acceden mediante login y password, creo la sesión y hasta ahí todo bien. El problema se genera cuando presiono el log out pues aparentemente la sesión ha finalizado.
Sin embargo cuando presiono el atrás del explorer, la página se me vuelve a mostrar, por otro lado, cuando hago un refresh de la página me manda a la página que le puse por defecto cuando no encuentra sesiones activas.

1 Respuesta

Respuesta
1
Supongo que la sesión la invalidas con session. Invalidate ¿no?
¿Qué tipo de control haces para comprobar la session?
Disculpa, ¿pero no entiendo a que te refieres con tipo de control?
El sistema de login lo genero con la utilidad de ultradev mx al igual que el de logout, ¿sera por eso que no me funciona? Lo único que hago es que cambio los parámetros de putvalue, por setattribute y por removevalue en caso de que la sesión termine.
Si tienes referencias donde muestren el manejo de sesiones con ejemplos te agradecería me las hicieras saber, serian de mucha utilidad para mi
Saludos
Te aconsejo que el tratamiento lo hagas tú mismo... te evitarás errores "desconocidos" y te permitirá´el control total de tu app. NO es complejo!
Lo que te ocurre seguramente se arregle con un buen control de la session. Una vez el user ha hecho "logOut" o la session ha caducado el objeto session es inválido. Lo único que tienes que hacer es comprobar si el obj session se ha creado de nuevo o no... mñirate los links que te paso y verás como con es complicado (hay uno en inglés y otro en castellano)
Aquí tienes referencias:
http://developer.java.sun.com/developer/onlineTraining/JSPIntro/contents.html#JSPIntro9
(ojo... busca en la página el texto "Session Management").
http://www-1.ibm.com/servers/eserver/iseries/software/websphere/wsappserver/docs/as400v35SpanishStd/docs/servscrt.html
(Este link es en castellano)
Sobre el primer punto:
Prueba de copiar el servlet.jar en WEB-INF/classes.
Si no te funciona prueba de copiarlo en JDK_HOME/jre/ext/
(/JDK_HOME es el directorio donde tienes el JDK). COn todas estas pruebas has de copiar y reiniciar el servidor.
SObre el segundo punto:
EL código para crear la session seria:
HttpSession miSession = request.getSession(true);
miSession.setAttribute("isLogin","true");
Lo que tienes que hacer es que en las páginas donde quieras comprobar que la session ya existe comprobar lo siguiente:
if (miSession.isNew()){
// en este if entra si la session se acaba de crear.
Eso ssignifica que la session había caducado y que por lo tanto el usuario no tiene privilegios. Lo tienes que "hechar"
}
Ahora haces la comprobación del login (si el user está logado);
if (miSession.getAttribute(isLogin)==null){
//el user NO esta logado, lo rediriges a la página login.
}
Mírate el API de HttpSession. Hay un método que especifica la duración de la session.
Prueba y dime algo
Ok bueno te cuento que funciona
El código que puse en la página que hago de entrada es:
<%
HttpSession miSession = request.getSession(true);
miSession.setAttribute("isLogin","true");
String usuario = request.getParameter("usuario");
String pagina = "intro1.jsp";
String pagina_fallo = "error.jsp";
if (usuario != null){
if (request.getParameter("usuario").equals("manuel") && request.getParameter("pwd").equals("manuel")) {
miSession.setAttribute("user", usuario);
}else{
pagina = pagina_fallo;
}
response.sendRedirect(response.encodeRedirectURL(pagina));
return;
}
%>
el de la pagina a la que la direcciona cuando es correcto es:
<%
HttpSession miSession = request.getSession(true);
String id = miSession.getId();
String nombre = (String)miSession.getAttribute("user");
if (miSession.isNew()){
// en este if entra si la session se acaba de crear.
String pagina = "error.jsp";
response.sendRedirect(response.encodeRedirectURL(pagina));
return;
}
if (miSession.getAttribute("isLogin").equals("false")){
String pagina = "error.jsp";
response.sendRedirect(response.encodeRedirectURL(pagina));
return;
}
%>
Sim embargo te cuento que el session.invalidate lo hace porque cuando le pongo logout me crea otra session nueva(la reviso por el session.getId), sin embargo cuando le pongo atrás al navegador me muestra la página de la cual me deslogee, este es el código que uso para el log out.
<%
String salir = request.getRequestURI()+"?salir=1";
if (request.getParameter("salir") !=null && request.getParameter("salir").equals("1")){
miSession.setAttribute("isLogin","false");
miSession.invalidate();
String direccionar = "intro.jsp";
response.sendRedirect(response.encodeRedirectURL(direccionar));
return;
}
%>
Te agradezco si me ayudas a encontrar una solución, gracias nuevamente
Ok estuve intentando y nada, sigue sin funcionar, mire ejemplos en la web, y trate de hacerlo en el compilador de java(hacer el servlet e importarlo) pero me aparecía que package javax. Servlet doesn't exits, estuve leyendo y decía que agregar en el classpath el path del tomcat con la ruta del servlet.jar, lo hice y sigue sin funcionar el asunto.
De las sesiones pues estuve leyendo las referencias que me enviaste y ya tengo más claridad, sin embargo no entiendo muy bien la forma en que creo una sesión y le paso ese id a la otra página es decir basta con poner.
HttpSession session = session.getcrete(true)
este es el codigo que uso para salir de la sesion
String pagina = "index.jsp";
if(request.getParameter("logout")!=null){
session.removeValue("loginid");
session.removeValue("isadmin");
session.invalidate();
}
String tal = response.sendRedirect(response.encodeRedirectURL(pagina));
return;
Sin embargo el de crearla no lo tengo muy claro, la verdad estoy bien confundido, espero me puedas ayudar
Gracias
Se te crea una session nueva porque la instrucción request. GetSession(true); te crea una session nueva si no está ya creada... En tu caso, lo que haces es invalidar (la destruyes) y luego la vuelves a crear...
Lo que puedes hacer es usar la instrucción request. Getsession(); (sin true) para que no te cree la session. Mira el javadoc de HttpSession y verás con más detalle lo que te digo.
No me funciona
Probé agregándole lo del cache y nada
Mira este es el código que uso para el log out.
String salir = request.getRequestURI()+"?salir=1";
if (request.getParameter("salir") !=null && request.getParameter("salir").equals("1")){
miSession.removeAttribute("isLogin");
miSession.invalidate();
String direccionar = "intro.jsp";
response.sendRedirect(response.encodeRedirectURL(direccionar));
return;
}
Ahora le sigo dando atrás al navegador y apareciendo la página después de que hago el log out, lo que si cambia es el numero de session id.
Saludos y gracias nuevamente
Muchas gracias por tu ayuda, realmente me fue de mucha utilidad
También es posible que sea un problema de la caché... Mírate esto y prueba:
http://www.todoexpertos.com/herramientas/leermsgpublico.aspx?idproceso=592488
Bueno te cuento que ya me funciono perfecto
Me hacia falta poner un condicional de si el nombre de usuario == null
con eso automáticamente me deslogeo y pongo atrás me bota a la página de inicio.
Gracias por tu ayuda fue muy valiosa, por cierto tengo otra duda.
Como le haría para permitir que solo se pudiera logear una persona con un usuario y contraseña, para evitar digamos que 2 personas entren con el mismo usuario
Gracias
Ok, la deje sin el true, igual me sigue mostrando los datos cuando le pongo atrás, sera por lo siguiente.
1. POrque cuando hago el logout envío al usuario a la página de inicio (l;ogin y password)
2. He revisado el foro y visto soluciones como trabajar con el session.invalidate() y session.removeattribute, lo hago y me sigue mostrando la página anterior cuando hago atrás.
Porque crees que sea. Revise el api y dice que el getsession ya no se usa para la version api 2.1 (deprecated).
Sigo sin entender porque me muestra la página anterior, tendrá algo que ver con el código mediante el cual válido lo de las sessiones.
// Este es el del cache
<%
response.setHeader("Content-Type", "text/html; charset=windows-1252");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "Mon, 01 Jan 2001 00:00:01 GMT");
response.setHeader("Cache-Control", "no-store");
response.setHeader("Cache-Control", "must-revalidate");
response.setHeader("Cache-Control", "no-cache");
//Tratamiento de la session
HttpSession miSession = request.getSession();
String id = miSession.getId();
String nombre = (String)miSession.getAttribute("user");
// Prgeunto si la session es nueva
if (miSession.isNew()){
// en este if entra si la session se acaba de crear.
String pagina = "error.jsp";
response.sendRedirect(response.encodeRedirectURL(pagina));
return;
}
// idsesion es el numero de la session, solo lo muestro para verificar si cambia el numero de session cuando le pongo invalidate.
String identify = (String)miSession.getAttribute("idsesion");
if (miSession == null){
response.sendRedirect("error.jsp");
}else{
if (miSession.getAttribute("isLogin") == null || !miSession.getAttribute("isLogin").equals("true")){
response.sendRedirect("error.jsp");
}
}
%>
//codigo del log out
<%
String salir = request.getRequestURI()+"?salir=1";
if (request.getParameter("salir") !=null && request.getParameter("salir").equals("1")){
miSession.removeAttribute("isLogin");
miSession.invalidate();
String direccionar = "intro.jsp";
response.sendRedirect(response.encodeRedirectURL(direccionar));
return;
}
%>
Gracias por tu ayuda
Pásame el código correspondiente al tratamiento de la sesión que hay en la página que te aparece cuando haces "atrás" con el navegador.
Me alegro que al final te funcinara!
Para tener ese control lo puedes hacer con una variable statica global que almacene los usuarios que estén logados. Por ejemplo, en la pa´gina de login tienes un Vector estático y cada vez que alguien se loga lo añades a ese vector... Lo que ocurre es que obligas a que los usuarios hagan logout a la fuerza!
Yo te aconsejo que no pongas esa rstricción.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas