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

uso de servlets y sesiones

Estas en el tema de uso de servlets y sesiones en el foro de Java en Foros del Web. Hola, estoy haciendo un proyecto que gestiona una página web de una tienda virtual. Me sucede un problema muy raro. ¿ Es normal que cuando ...
  #1 (permalink)  
Antiguo 11/05/2010, 10:41
 
Fecha de Ingreso: mayo-2010
Mensajes: 8
Antigüedad: 13 años, 11 meses
Puntos: 0
uso de servlets y sesiones

Hola, estoy haciendo un proyecto que gestiona una página web de una tienda virtual. Me sucede un problema muy raro. ¿ Es normal que cuando uses un formulario y lo redirigas a un servlet, no envíe el entorno de sesion a dicho servlet?

Mando el formulario al servlet y me captura bien los datos del formulario, pero además necesito tener acceso a las variables de sesion, ya que mi página web se divide en varios marcos y necesito ese campo en todos. El problema que tengo es que cuando ejecuto request.getSession() me crea una sesión totalmente distinta(lo he comprobado con getId). Con lo que no tengo manera de referenciar unos frames con otros.¿alguno me puede dar una solucion? Además como se crea una sesión nueva, el frame desde el que invoco al formulario tiene una sesión totalmente distinta al resto de la página

Por cierto, utilizo glassfish, por si eso sirve de ayuda

En el código que pongo en el siguiente post, me crea automáticamente una sesión nueva cuando llamo al método getParameter si hago antes de eso getSession(false) me da error por ser nulo, intuyo que el error es porque no pasa la sesión de mi página en jsp a mi servlet.

muchas gracias.

Última edición por tasshelof; 11/05/2010 a las 12:18
  #2 (permalink)  
Antiguo 11/05/2010, 10:45
 
Fecha de Ingreso: mayo-2010
Mensajes: 8
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: uso de servlets y sesiones

el codigo en cuestión es el siguiente. el formulario en mi página es así

<%@ page session="true" language="java" import="java.util.*" %>

<html>


${session}

<form action="http://localhost:8080/web/AceptarIngreso" method="POST">
Nick: <input name="txt_Nick" type="text">
Contraseña: <input name="txt_Contraseña" type="password">
<input name=txt_sesion value="<%session.getId();%>" type="hidden">
<input type="submit" value="Enviar" name="btn_enviar">
</form>
<a href="http://www.forosdelweb.com/f67/registro/registroBloque3.jsp">registrarse</a>
<%out.println(session.getAttribute("usuario"));% >
<%out.println(session.getAttribute("prueba"));%>
<%out.println(session.getAttribute("usuarioLogeado "));%>
<%out.println(request.getRequestedSessionId());% >
<p>
<%out.println(request.getSession().getId());%>

</html>

y el metodo doPost en mi servlet es este



// Proceso HTTP Post de la petición
public void doPost(HttpServletRequest peticion,HttpServletResponse respuesta)throws ServletException,IOException {
String nick = "";
String contrasena = "";
String resultado = "";
String identificador ="";

respuesta.setContentType("text/html");
PrintWriter out = respuesta.getWriter();
out.println("<html>");

// Obtiene todos los nomnbres de los parámetros
Enumeration parametros = peticion.getParameterNames();
String parametro = null; // variable para guardar el parámetro.

nick = peticion.getParameter((String)parametros.nextEleme nt());
contrasena = peticion.getParameter((String)parametros.nextEleme nt());
identificador = peticion.getParameter((String)parametros.nextEleme nt());

resultado = validarUsuario(nick,contrasena);
String nombre = encontrarNombre(resultado);
String id = encontrarIdentificador(resultado);


if (resultado.equals("$xxx%%%%%%%%%%xxx")){
out.println("HA INTRODUCIDO MAL EL NOMBRE DE USUARIO O LA CONTRASEÑA");
out.println();
out.println("<a href="+"./jsp/principal/principalBloque3.jsp"+">volver a logearse</a>");
}
else{
(peticion.getParameter((String)parametros.nextElem ent())).getSession(true);



out.println("peticion :"+peticion.getSession().getId()+":");

HttpSession objSesion = peticion.getSession(false);
String usuario = (String)peticion.getParameter("usuario");
objSesion.setAttribute("usuario", id);
out.println(objSesion.getId());



if ((id.charAt(0)) == 'A'){
out.println("BIENVENIDO, "+nick);
out.println(id);
out.println("<a href="+"./jsp/administrador/administradorBloque3.jsp"+">opciones</a>");



}
else {
out.println("BIENVENIDO, "+nick);
out.println(id);
out.println("<a href="+"./jsp/administrador/usuarioBloque3.jsp"+">opciones</a>");

}
}


out.println("</html>");
out.close();

}
  #3 (permalink)  
Antiguo 12/05/2010, 02:12
 
Fecha de Ingreso: febrero-2010
Mensajes: 128
Antigüedad: 14 años, 2 meses
Puntos: 3
Respuesta: uso de servlets y sesiones

Aparentemente no debería de fallar tu código.

Quita el false del método get Session, a mi no me ha dado ningún problema de la siguiente manera.

HttpSession sesion = request.getSession();
  #4 (permalink)  
Antiguo 12/05/2010, 07:30
 
Fecha de Ingreso: mayo-2010
Mensajes: 8
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: uso de servlets y sesiones

muchas gracias por la respuesta, la verdad es que me reafirmo en que prefiero programar en C xDD.

Si quito el false me genera una sesion nueva y yo necesito que me devuelva la sesion que llama. Quiza el problema venga en que declaro la variable dentro de otro archivo jsp y el metodo getSession dentro del servlet no son del todo compatibles(por el tema de la herencia y tal) y por eso dentro del servlet me genera una nueva sesión automáticamente.
  #5 (permalink)  
Antiguo 13/05/2010, 05:59
 
Fecha de Ingreso: febrero-2010
Mensajes: 128
Antigüedad: 14 años, 2 meses
Puntos: 3
Respuesta: uso de servlets y sesiones

  1. Class javax.​servlet.​http.​HttpServletRequest

    public HttpSession getSession()
    Returns the current session associated with this request, or if the request does not have a session, creates one.

    Returns:
    the HttpSession associated with this request

  1. Class javax.​servlet.​http.​HttpServletRequest

    public HttpSession getSession(boolean create)

    Returns the current HttpSession associated with this request or, if there is no current session and create is true, returns a new session.

    If create is false and the request has no valid HttpSession, this method returns null.
    To make sure the session is properly maintained, you must call this method before the response is committed. If the container is using cookies to maintain session integrity and is asked to create a new session when the response is committed, an IllegalStateException is thrown.

    Parameters:

    create - true to create a new session for this request if necessary; false to return null if there's no current session
    Returns:
    the HttpSession associated with this request or null if create is false and the request has no valid session


Ahora te lo cuento con mis palabras:

Sin parámetros te devuelve la sesión y si no la hay, te la crea.

Con parámetros:
  1. Si pones false, te devuelve la sesión y si no la hay te devuelve null.
  2. Si pones true, te devuelve la sesión y si no la hay crea una nueva.

Pienso que si te da error puede ser porque hayas modificado el objeto request por otro, o porque quizas hayas sobreescrito la sesión.

quizas el problema sea esta línea, que tan siguiera entiendo...
(peticion.getParameter((String)parametros.nextElem ent())).getSession(true);

Intenta olvidartedel método getSession(boolean) asi te vas a hacer un lio xk en unos casos te la crea, en otros no y en otros te da null...

cuando quieras borrar la sesión utiliza session.invalidate() y cuando quieras recuperarla haz request.getSession().

Así siempre tendrás una sesión y cuando quieras borrarla te aseguras de dónde la has borrado.

espero que con esto lo puedas arreglar...
  #6 (permalink)  
Antiguo 13/05/2010, 11:26
 
Fecha de Ingreso: mayo-2010
Mensajes: 8
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: uso de servlets y sesiones

ya está solucionado. Lo he solucionado un poco chapuceramente pero menos da una piedra. Básicamente he creado un servlet fantasma antes de llamar a mi servlet, después de esto, el resto de servlets no me cambian la sesión.

El problema lo tenía en que la clase que maneja la sesión dentro de un servlet y de un archivo jsp, no son la misma, por lo tanto, dentro del servlet me buscaba una propia del servlet, como no existía la creaba, y la redirigía al cliente.Al tener un cliente compuesto por 4 frames, el frame que invocaba el servlet tenía una sesión distinto del resto, por lo que iba a su bola. Una vez que has llamado a un servlet, como queda en memoria, la sesión creada por este también.

Ya me estaba poniendo de los nervios, porque tengo que entregar el proyecto en 2 semanas y si no no acababa la carrera xD.

Denis127, esa línea la puse para probar otro tipo de solución, pero realmente no hacía lo que quería, de todas formas gracias por tu tiempo ;)

Etiquetas: sesiones, servlet
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




La zona horaria es GMT -6. Ahora son las 06:07.