JSP (Java Server Page) - seguimiento de usuarios

 
Vista:

seguimiento de usuarios

Publicado por nepthis (37 intervenciones) el 22/01/2007 19:59:54
Hola de nuevo!! Cuando creía que tenía dominada una cosa, me he dao cuenta de que falla y no sé ni cómo explicaros el asunto. Voy a intentarlo. Por favor, que alguien me explique cuál es el error porque yo no lo entiendo.

Mi usuario se tiene que autenticar para hacer cierta operacion. Para ello, desde una página con un formulario de autenticación llamo a un servlet, cuyo cógido doGet es el siguiente:

public void doGet ... {
Usuario usuario = new Usuario ();
HttpSession session = request.getSession(false);
if (session != null)
{
if ( ( nombre.equals(login ) ) & (clave.equals(password ) ) )
{
usuario.setRegistrado(true);
session.setAttribute ("usuario",usuario);
getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/menuAdmin.jsp").forward(request, response);
}
else
{
usuario.setRegistrado(false);
session.setAttribute ("usuario",usuario);
getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/errorUsuario.jsp").forward(request, response);
}

}
else
{
getServletConfig().getServletContext().getRequestDispatcher("/libreria/controlador?x=0").forward(request, response);
}

Controlador es un servlet que inicia sesión. Todas mis páginas pasan por este servlet que lo primero que hace es iniciar sesión.Esto lo necesito porque además del usuario tengo otras variables guardadas en la sesión, que uso en todas las páginas. Con el parámetro 0 consigo que redirija a la página de autenticación.

La página de menuAdmin, tiene (a la que accedes una vez autenticado)

<%@ page language="java" import="java.util.*" %>
<jsp:useBean id="usuario" class="libreria.Usuario" scope="session" />
<%
if ( (usuario.isRegistrado()) ){
%>

CODIGO DE LA PÁGINA

<%
}
else
{
response.sendRedirect("libreria/controlador?x=0");
}
%>

El caso, es que si añado esta página a favoritos, y cierro sesión, cuando intento acceder a ella, efectivamente me lleva a la página de autenticación (controlador?x=0), pero, cuál es mi sorpresa que si doy a refrescar, se carga la página menuAdmin!!
¿porqué hace esto? ¿dónde guarda algo para que si refrescas te muestre la página en lugar de llevarte contínuamente a controlador?x=0? que es lo que debería hacer.

Gracias por ayudarme.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:seguimiento de usuarios

Publicado por nepthis (37 intervenciones) el 22/01/2007 20:57:35
Estoy desesperada. He probado cambiando el código de la página menuAdmin.jsp

<%@ page language="java" import="java.util.*, libreria.Usuario" %>
<%
session = request.getSession(false);
if (session != null)
{
Usuario usuario = (Usuario) session.getAttribute ("usuario");
if (usuario.isRegistrado()) {
%>

...........................

si guardo en favoritos, cierro el navegado, lo vuelvo a abrir, y la cargo me sale la página de autenticación, pero si refresco se carga bien, y no debería.
si cierro el tomcat, y lo vuelvo a abrir, sale la página de autenticación, y al refrescar directamente sale

java.lang.NullPointerException
libreria.autenticacion.doGet(autenticacion.java:73)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

¿cómo se contrala que sólo si estás autenticado tengas acceso a determinadas páginas??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por nepthis (37 intervenciones) el 23/01/2007 17:55:53
Bueno, la excepción ya he consiguido que no la de, pero sigo con el otro problema. ¿qué tipo de información guarda el tomcat y dónde, para que si le das a refrescar una página, sin haber parado el servidor, la cargue bien, en lugar de insistir con que me autentique. Sé que tiene que ser algo de eso, porque si paras el servidor y lo vuelves a arrancar no hay problema.

muchas gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por Gonzalo (72 intervenciones) el 23/01/2007 20:43:42
No puedo mirar mucho el código ahora mismo pero puede ser que lo que te pase tenga que ver con lo siguiente:

Tienes sesión.

Quiero decir, aunque tú no crees explícitamente una sesión, el servidor te crea una para poder hacer el seguimiento en cuanto tiene que mantener algo a lo largo de la sesión.

De modo que cuando le das a refrescar, cuando haces esa segunda llamada, sesión tienes. Ya has estado antes. Es la segunda llamada que haces. El servidor te ha creado una sesión porque has declarado que tu bean es válido en el ámbito de la sesión, con lo cual el servidor tiene que crear una sesión para poder decir que la página es válida en ella.

En resumen, que lo que tienes que comprobar siempre va en este sentido:

Si existe sesión... [if 1]
····Si en esa sesión está identificado... [if 2]
········Todo correcto, le muestro la página restringida.
····si hay sesión pero no está identificado: [else 2]
········pueden pasar dos cosas:
········Si acaba de enviar usuario y password: [if 3]
············compruebo que sean válidos. Si son correctos: [if 4]
················marco en la sesion que está identificado correctamente y le mando a la página restringida
············Si no son correctos: [else 4]
················Le mando a la página de error
············fin [4]
········Si no acaba de enviar usuario y password [else 3]
············Hay sesión, no está identificado y no envía usuario y password -> está intentando entrar por la cara, así que le mando a donde sea.
········fin [3]
····fin[2]
sino existe sesión: [else 1]
····le mando a identificarse o al inicio o a donde sea.
fin [1]

En tu caso, no estás contemplando correctamente que pueda existir una sesión aunque no esté identificado. Son cosas distintas. Sesión va a tener porque la crea el Tomcat en cuanto haces referencia a la sesión. Pero esa sesión no tendrá nada. Tienes que seguir comprobando todos los casos.

No sé si quedará muy claro con ese pseudocódigo que he puesto. Lo siento. Si no te queda claro dilo, eh.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por nepthis (37 intervenciones) el 24/01/2007 21:20:50
hola!! muchas gracias!! pero ese no es el problema. Esto que tu me dices es lo que hago en el servlet, y, si cierro el navegador y vuelvo a abrir, y doy a actualizar me carga la página sin tener en cuenta nada. Sin embargo, si en lugar de utilizar servlet lo hago directamente con jsp no pasa eso, por mucho que actualice me lleva a la página de autenticacion. Pero necesito utilizar servlet.

Debe ser algo que guarda el tomcat y que si lo paro y reinicio lo borra y no tengo ese problema. Pero si simplemente cierro el navegador pues.....no lo hace bien. Pero no sé que es eso que guarda ni donde.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por Gonzalo (72 intervenciones) el 24/01/2007 22:26:44
Uhm... creo que me he perdido un poco. Si me pudieras explicar un poco mejor cómo va el asunto...

A ver... por lo que he entendido, hay dos casos. Ambos parten desde cero (el navegador recién abierto y el servidor recién arrancado).

CASO 1:
Intentas acceder directamente a menuAdmin.jsp -> te manda (redirect) a libreria/controlador?x=0
Si le das a refrescar, lógicamente te refresca libreria/controlador?x=0.
Si en lugar de darle a refrescar le pides otra vez menuAdmin.jsp -> Qué hace?

CASO 2:
Intentas acceder al servlet -> te manda (forward) a libreria/controlador?x=0
Si le das a refrescar -> te carga menuAdmin.jsp ??
Si fuerzas el refresco (Control + F5) -> Qué hace?


Siento no poder decirte nada, pero es que no tengo muy clara tu explicación. Por lo demás podrían ser muchas cosas. Podría ser un tema de caché, o que algo falle en el servlet (¿lo que pusiste es el método doGet entero o faltaba alguna cosa?)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por nepthis (37 intervenciones) el 25/01/2007 06:09:31
Código de doGet:

Usuario usuario = new Usuario ();
HttpSession session = request.getSession(false);

if ( (session != null) && (nombre != null) && (clave !=null) )

{
if ( ( nombre.equals(login ) ) & (clave.equals(password ) ) ) {

usuario.setRegistrado(true);
session.setAttribute ("usuario",usuario);
getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/menuAdmin.jsp").forward(request, response);

}
else
{
usuario.setRegistrado(false);
session.setAttribute ("usuario",usuario);
getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/errorUsuario.jsp").forward(request, response);
}
}
else // volver a autenticar.
{
getServletConfig().getServletContext().getRequestDispatcher("/libreria/controlador?x=0").forward(request, response);
}

}
**********************************************************************
El código de menu admin.jsp:

<%@ page language="java" import="java.util.*" %>
<jsp:useBean id="usuario" class="libreria.Usuario" scope="session" />
<%
if ( (usuario.isRegistrado()) ){
%>

CODIGO DE LA PÁGINA

<%
}
else
{
response.sendRedirect("libreria/controlador?x=0");
}
%>

*************************************************************************
CASO 1:
Una vez que he entrado en menuAdmin.jsp, lo guardo en favoritos y cierro el navegado. Lo vuelvo a abrir e intento acceder directamente a menuAdmin.jsp -> me manda (redirect) a libreria/controlador?x=0
Si le doy a refrescar, me manda a menuAdmin.jsp

CASO 2:
Una vez que he entrado en menuAdmin.jsp, lo guardo en favoritos y cierro el navegador y el tomcat. Lo vuelvo a abrir e intento acceder directamente a menuAdmin.jsp -> me manda (redirect) a libreria/controlador?x=0
Si le doy a refrescar, me manda a libreria/controlador?x=0
Este segundo caso es lo que quiero que haga sin necesidad de tener que parar el tomcat, porque no puedo hacer eso.

He probado a hacer la autenticación directamente con jsp, sin utilizar servlet de por medio, y no da problemas. Con lo que supongo que es algo del servlet. Pero me gustaría usar servlet.

otra cosita: cómo se hace uso de
<jsp:useBean id="usuario" class="libreria.Usuario" scope="session" />
en un servlet?

Gracias de nuevo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por Gonzalo (72 intervenciones) el 25/01/2007 09:06:35
Wao, vamos poco a poco...

Te pregunté por el método doGet porque hay algo que no me queda claro.

¿De dónde vienen "nombre" y "clave" y "login" y "password"?
(Me refiero a las que se usan en if ( ( nombre.equals(login ) ) & (clave.equals(password ) ) ...)

Lo que decía que podía faltar iba precísamente en ese sentido. Vamos, en lo que estoy pensando es en que debería haber algo así

public void doGet(HttpServletRequest request, HttpServletResponse response)
·········································throws IOException, ServletException {

····// Primero sacamos login y password (si los hay) de la petición que nos ha llegado
····String login = request.getParameter("login");
····String password = request.getParameter("password");

····// Ahora sacamos nombre y clave de la base de datos, o de un fichero o de...
····String nombre = ...;
····String clave = ...;

····// Ahora es cuando comprobamos qué tenemos y lo que tenemos que hacer

····...

}

Y esa parte es la que no veo dónde ocurre. Y lo digo porque es ahí donde tiene que ocurrir. Si la estás haciendo en otro sitio, y dado que *el*servlet*sólo*se*instancia*una*vez*, seguramente se están quedando los valores de peticiones anteriores.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por nepthis (37 intervenciones) el 25/01/2007 17:52:04
jajaja, pues sí, efectivamente era eso. Yo estaba sacando esos valores en el doPost, y después los utilizaba en el doGet. muchas gracias!!! Te agradezco un monón tu atención.Pero sigue sin funcionar otra cosilla: Una vez que estoy autenticada, en el resto de las páginas jsp que utilizo hago la comprobación que te mostré en menuAdmin.jsp, con el bean. Y todo funciona bien, es decir, yo guardo esas páginas en favoritos, y al cargarlas se cargan bien, y al refrescar tambien. Pero si utilizo un servlet cuyo código es (del doget, en el dopost he sacado los valores del formulario para insertar un nuevo aviso en la bd)

try
{
HttpSession session = request.getSession(false);
Usuario usuario = (Usuario) session.getAttribute("usuario");
if ( (session != null) && (usuario.isRegistrado()) )

{
*****hago las comprobaciones necesarias y inserto el aviso en la bd*****
if (insertado == 1)
{
getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/EnvioAviso.jsp").forward(request, response);
}else
{
getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/ErrorEnvioAviso.jsp").forward(request, response);
}
}

else // es necesario estar autenticado para poder realizar la operación requerida.

{
getServletConfig().getServletContext().getRequestDispatcher("/libreria/controlador?x=0").forward(request, response);
}

}
catch (Exception ex)
{
ex.printStackTrace ();
}
}

Pues bien, si guardo en favoritos EnvioAviso.jsp (y efectivamente el aviso se ha insertado), cierro el navegador y accedo a la página, no me sale nada, una página en blanco (aunque pare el servidor tengo el mismo problema), y yo lo que quiero es que salga la de autenticación.

Por eso te preguntaba como puedo utilizar en un servlet el bean que utilizo en las páginas jsp para saber que estoy registrado , porque esto no funciona.

Gracias de nuevo!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por nepthis (37 intervenciones) el 25/01/2007 19:10:32
He mirado el fichero de log y me da este error

Created MBeanServer with ID: 535b58:1105a2ba2a8:-8000:usuario-7e6f7f9:1
java.lang.NullPointerException
at libreria.NuevoAviso.doGet(NuevoAviso.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:831)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:639)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1196)
at java.lang.Thread.run(Unknown Source)

La línea 70 ronda en torno a: (no te lo sé decir exactamente xq en ese fichero hay grabadas otras salidas del mismo servlet, pero todas son 68, 70,..según he hecho pruebas, y son de esa franja de código). La úlima escrita es esta (70)

Usuario usuario = (Usuario) session.getAttribute("usuario");
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por Gonzalo (72 intervenciones) el 26/01/2007 09:27:07
Bueno...

Tenemos esto:
...
HttpSession session = request.getSession(false);
Usuario usuario = (Usuario) session.getAttribute("usuario");
if ( (session != null) && (usuario.isRegistrado()) ) {
...

Es decir, que estás llamando a session.getAttribute antes de comprobar si es nula o no. En el caso de abrir el navegador e ir directamente aquí, no habrá sesión, con lo cual dará un NullPointerException.

Nota: Tampoco estás comprobando si usuario está o no en la sesión.
Debería ser algo como...

HttpSession session = request.getSession(false);
if (session != null) {
····Usuario usuario = (Usuario) session.getAttribute("usuario");
····if ( (usuario != null) && (usuario.isRegistrado() ) {
········// *****hago las comprobaciones necesarias y inserto el aviso en la bd*****
········// etc, etc
····} else { // Es necesario autentificarse etc...
········// forward...
····}
} else {
····// También aquí hago forward porque ni siquiera hay sesión
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por nepthis (37 intervenciones) el 27/01/2007 18:31:27
Gracias Gonzalo! Ahora ya funciona bien. Pero, aunque funciona, hay una cosa que no termino de enterder. Para que menuAdmin.jsp (generada a través del servlet con un forward) no dierra ese error, en el servlet (que es lo que se guarda en la URL cuando guardas esa pagina en favoritos y por tanto lo que se ejecuta cuando intentas acceder a ella una vez guardada) hay que hacer la comprobación que me has dicho para que no dierra ese error. Pues bien, menuAdmin.jsp tiene un enlace a una página menuInserAviso.jsp que es un formulario con los datos del nuevo aviso. Si guardo esta página, como ya no es generada por un servlet, en la URL se guarda realmente la direción de la página jsp. Por tanto, al acceder a ella, es ella misma la que se ejecuta, y ésta página sólo tiene

%@ page language="java" import="java.util.*" %>
<jsp:useBean id="usuario" class="libreria.Usuario" scope="session" />
<%
if (usuario.isRegistrado()){
%>
.................................
<%
}
else
{
response.sendRedirect("libreria/controlador?x=0");
}
%>

¿Por qué no me dá el mismo error que pasaba con menuAdmin, si tampoco estoy comprobando que el usuario sea != null?

Gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:seguimiento de usuarios

Publicado por Gonzalo (72 intervenciones) el 28/01/2007 00:31:44
Antes de la explicación, un detalle.

La página jsp, no "es generada por un servlet". Quiero decir, hacer el forward lo único que significa es decirle que se ejecute. Pero una página JSP es en sí misma un servlet. Vamos, que el forward sólo es "yo ya he acabado, ahora pásale la petición a este otro".

Bueno, si eso no ha quedado claro, tampoco importa mucho ahora mismo. A lo que íbamos.

En tu página menuInserAviso.jsp, tienes esto:
<jsp:useBean id="usuario" class="libreria.Usuario" scope="session" />
<%
if (usuario.isRegistrado()){
%>
...
Y en el servlet tenías esto:
Usuario usuario = (Usuario) session.getAttribute("usuario");
if ( (session != null) && (usuario.isRegistrado()) )

La diferencia es que esta línea de aquí:
<jsp:useBean id="usuario" class="libreria.Usuario" scope="session" />
esconde más cosas de las que parecen a simple vista.

Dice la documentación de JSP que useBean "locates or instantiates a JavaBeans component. <jsp:useBean> first attempts to locate an instance of the Bean. If the Bean does not exist, <jsp:useBean> instantiates it from a class or serialized template."

Es decir, que esa línea busca un objeto de tipo libreria.Usuario en el scope que le has puesto, la sesión. Si la encuentra, crea la referencia que has puesto en el id, usuario, y le asigna el objeto encontrado. Pero si no encuentra un libreria.Usuario en la sesión, lo que hace es instanciar un bean de tipo libreria.Usuario nuevo.

Así que luego, aunque en ambos casos haces directamente el usuario.isRegistrado() en el caso del JSP tienes seguro un Usuario en tu variable, mientras que en el caso del servlet la llamada a session.getAttribute("usuario") si no encuentra nada llamado así en la sesión, simplemente te devuelve null.

Esto es algo a tener en cuenta en general. Aunque un JSP es en el fondo un servlet disfrazado, los tags de JSP hacen bastantes cosas de forma transparente que en un servlet tendrías que hacer tú a mano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Gracias de nuevo Gonzalo!

Publicado por nepthis (37 intervenciones) el 30/01/2007 17:57:46
Gracias de nuevo Gonzalo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar