Como estrella en ascenso, JSP puede ocupar una determinada posición en el entorno de programación de servidores, lo que está estrechamente relacionado con su buen soporte para una serie de estándares de la industria. La sesión es una de las infraestructuras que proporciona. Como programador, puede implementar fácilmente una administración de usuarios basada en sesiones sin preocuparse por cómo se implementa en el cliente. Hoy en día, existen diferentes formas de tratar con los usuarios en línea.
Una es que la actualización de la página está controlada por el usuario y el servidor controla un tiempo de espera de 30 minutos. Una vez transcurrido el tiempo, el usuario será expulsado si no se realiza ninguna acción. La ventaja de este método es que si el usuario olvida cerrar sesión, puede evitar que otros realicen operaciones maliciosas. La desventaja es que si está haciendo algo que requiere mucho tiempo y excede este límite de tiempo, es posible que deba iniciar sesión nuevamente al enviarlo. Si la superficie original de la hoja se ve obligada a fallar nuevamente, es posible que pierda el trabajo que ha realizado. Desde una perspectiva de implementación, este es el más simple y el lado del servidor implementa este modo de forma predeterminada.
Otra forma es que el sitio adopte una estructura de marco, y hay un marco o iframe oculto que se actualiza constantemente, por lo que nunca será expulsado. Sin embargo, para determinar si está en línea, el servidor debe configurar un. tiempo de aturdimiento Si excede este tiempo de aturdimiento, si no actualiza otras páginas excepto esta página que se actualiza automáticamente, se considerará que ya no está en línea. Un ejemplo típico de este enfoque es xici.net. Su ventaja es que puede utilizar la actualización continua para implementar algunas funciones similares a las de un servidor, como enviar mensajes entre internautas.
No importa qué modo se utilice, es necesario realizar algún trabajo adicional para poder explorar a todos los usuarios actualmente en línea. No existe una API para obtener la lista de sesiones en la API de Servlet.
Lo que se puede utilizar es Listener. Las especificaciones de Servlet 2.2 y 2.3 son ligeramente diferentes aquí. HttpSessionBindingListener en 2.2 puede implementar una clase que le notifica cuando cambia el atributo en una sesión HTTP. HttpSessionAttributeListener también se introdujo en 2.3. Dado que el entorno que estoy usando es Visual Age para Java 4 y JRun Server 3.1, no admiten directamente la programación de Servlet 2.3. Aquí uso HttpSessionBindingListener
. implementar la interfaz HttpSessionBindingListener. Esta interfaz tiene dos métodos:
public void valueBound(evento HttpSessionBindingEvent)
public void valueUnbound(evento HttpSessionBindingEvent)
Cuando ejecuta Session.addAttribute(String,Object), si ha agregado una clase que implementa la interfaz HttpSessionBindingListener como un atributo, Session lo notificará su clase y llame a su método valueBound. Por el contrario, el método Session.removeAttribute corresponde al método valueUndound.
la clase pública HttpSessionBinding implementa javax.servlet.http.HttpSessionBindingListener
{
aplicación ServletContext = nulo;
pública HttpSessionBinding (aplicación ServletContext)
{
super();
si (aplicación == nula)
lanza una nueva IllegalArgumentException ("la aplicación nula no se acepta.")
; .application = aplicación;
}
public void valueBound(javax.servlet.http.HttpSessionBindingEvent e)
{
Vector activeSessions = (Vector
)
application.getAttribute("activeSessions")
;
}
JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("usuario");
if (sessionUser!= null)
{
activeSessions.add(e.getSession()
}
application.setAttribute("activeSessions",activeSessions) }
public void valueUnbound(javax.servlet.http.HttpSessionBindingEvent e)
{
JDBCUser
sessionUser
= (JDBCUser
)e.getSession().getAttribute("usuario")
; .getAttribute("activeSessions");
if (activeSessions! = null)
{
activeSessions.remove(e.getSession().getId());
application.setAttribute
(
"
activeSessions
"
,activeSessions);
La clase es una clase de usuario arbitraria. Al iniciar sesión como usuario, agregue la clase Usuario y la clase HttpSessionBinding a la sesión.
De esta forma, cada vez que un usuario inicie sesión, se agregará un registro al vector del atributo "activeSessions" en la aplicación. Siempre que se agota el tiempo de espera de la sesión, se activa valueUnbound y la sesión que se agotará se elimina de este vector
public void login()
throws ACLException,SQLException,IOException
{
/* get JDBC User Class */
if (user != null )
{
cerrar sesión ()
;
}
{
//si
se agotó el tiempo de sesión o el usuario no inició sesión, guarde la URL de destino temporalmente.
=null) || (this.request.getParameter("contraseña")==null) )
{
throw new ACLException("Ingrese un nombre de usuario y una contraseña válidos.
"
)
;
.request.getParameter("ID de usuario"),
this.request.getParameter(
"contraseña"));
user.touchLoginTime
();
,new HttpSessionBinding (aplicación));
}
}
Al iniciar sesión, agregue el Usuario y la clase de propósito BindingNotofy a la sesión. Al cerrar sesión, debe eliminar activamente la sesión en el vector activeSessions.
public void logout()
throws SQLException,ACLException
{
if (this.user == null && this.session.getAttribute("user")==null)
{
return ;
}
Vector activeSessions = (Vector) this.application.getAttribute("activeSessions");
if
(activeSessions
!= null)
{
activeSessions.remove(this.session)
;
util.Enumeration e = this.session.getAttributeNames();
while (e.hasMoreElements())
{
String s = (String)e.nextElement();
this.session.removeAttribute(s
}
this.user. );
this.user = null;
}
Estas dos funciones se encuentran en una clase HttpSessionManager. Esta clase se refiere al objeto global de la aplicación en jsp. El otro código de esta clase no tiene nada que ver con este artículo y es bastante largo, por lo que no lo publicaré.
Veamos cómo usarlo en JSP.
Supongamos que se envía un formulario de inicio de sesión a doLogin.jsp y que el formulario contiene los campos Nombre de usuario y contraseña. Extracto:
<%
HttpSessionManager hsm = new HttpSessionManager(aplicación, solicitud, respuesta);
intente
{
hsm.login()
}
catch (UserNotFoundException e)
{
respuesta.sendRedirect("InsufficientPrivilege.jsp?detail=User%20does%20not %20exist .");
return;
}
catch (InvalidPasswordException e2)
{
respuesta.sendRedirect("InsufficientPrivilege.jsp?detail=Invalid%20Password");
return;
}
catch (Exception e3)
{
%> Error:<%=e3. toString( ) %><br>
Presione <a href="login.jsp">Aquí</a> para volver a iniciar sesión
<% return
}
Response.sendRedirect
("index.jsp")
;
Ahora tiene Cómo obtener una lista de usuarios actualmente en línea.
<body bgcolor="#FFFFFF">
<table cellspaceping="0" cellpadding="0" width="100%">
<tr >
<td style="width:24px">SessionId
</td>
<td style= "width:80px" >Usuario
</td>
<td style="width:80px" >Hora de inicio de sesión
</td>
<td style="width:80px" >Última hora de acceso
</td>
</tr>
<%
Vector activeSessions = (Vector) application.getAttribute("activeSessions");
if (activeSessions == null)
{
activeSessions = new Vector();
application.setAttribute("activeSessions",activeSessions
}
Iterador = activeSessions.iterator(); ;
mientras (it.hasNext())
{
HttpSession sess = (HttpSession)it.next();
JDBCUser sessionUser = (JDBCUser)sess.getAttribute("usuario");
String userId = (sessionUser!=null)?sessionUser.getUserID ():"Ninguno";
%>
<tr>
<td nowrap=''><%= sess.getId() %></td>
<td nowrap=''><%= userId %></td>
<td nowrap=''>
<%= BeaconDate.getInstance( new Java.util.Date(sess.getCreationTime())).getDateTimeString()%></td>
<td class="<%= stl %>3 " nowrap=''>
<%= BeaconDate.getInstance( new java.util.Date(sess.getLastAccessedTime())).getDateTimeString()%></td>
</tr>
<%
}
%>
</table>
</body>
El código anterior recupera activeSessions de la aplicación y muestra la hora específica. Se supone que la clase BeaconDate es una clase de hora formateada.
De esta forma, obtenemos un marco para ver la lista de usuarios en línea. En cuanto a la paginación de listas de usuarios en línea y otras funciones, son irrelevantes para este artículo y no se discutirán.
Este es un ejemplo de un modelo sin actualización que se basa en el mecanismo de tiempo de espera de la sesión. Mi colega sonymusic señaló que muchas veces esto puede no ser confiable debido a las diferentes ideas de cada fabricante. Teniendo en cuenta este requisito, es necesario determinar si el tiempo desde el último uso por parte del usuario actual excede un valor de tiempo predeterminado cuando se actualiza cada superficie de la hoja. Básicamente, esto es implementar el tiempo de espera de la sesión usted mismo. Si necesita implementar un modelo de actualización, debe utilizar este método para juzgar la actualización para cada superficie de la hoja.