Contador usuarios conectados II

getparameter
18 de Junio del 2006
Intento llevar una cuenta de los usuarios que estan conectados a un site al mismo timpo, buscando he encontrado este codigo ...
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;

public class SessionCounter implements HttpSessionListener {

private static int activeSessions = 0;

/* Session Creation Event */
public void sessionCreated(HttpSessionEvent se) {
activeSessions++;
}

/* Session Invalidation Event */
public void sessionDestroyed(HttpSessionEvent se) {
if(activeSessions > 0)
activeSessions--;
}

public static int getActiveSessions() {
return activeSessions;
}
}

pero no me funciona :( .... lo que he hecho es compilar el .java (OK), meter la clase en el WEB-INF/classes/ de la aplicacion e intentar cargarla en el index para probar .... ERROR

Otra seria meterlo en el web.xml para que este disponible para todos los jsp ... pero como ???

Se aceptan sugerencias .... o soluciones alternativas ....

Eu

Ken
18 de Junio del 2006
A ver, lo que tienes es un Listener (la clase hereda de HttpSessionListener) así que tienes que indicar en el web.xml que la aplicación "coloque" esa clase "a la escucha" de las sesiones.

Para el caso de ContextListener (que es lo que yo manejo más) se hace dentro de <web-app> con un elemento llamado <listener>. Te pongo el ejemplo:

<listener>
<listener-class>MiClaseEscucha</listener-class>
</listener>

En el caso de las sesiones no estoy del todo seguro cómo hacerlo. Busca un apartado "session" dentro del web.xml (he de reconocer que no lo conozco muy bien... cada día descubro algo nuevo de ese archivo).

A ver si con esto te orientas un poco... y cuando encuentres dónde colocarlo y cómo acceder al número de sesiones y demás lo pones por aquí, vale?

Salu2

Ken

getparameter
18 de Junio del 2006
Al fin lo he conseguido .... la solucion la encontre en http://stardeveloper.com/articles/display.html?article=2001112001&page=1 ... copio codigo resumido para el que pueda interesarle ...

Lo primero es crear la clase SessionCounter.class a partir de este SessionCounter.java ...

package com.stardeveloper.web.listener;

import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;

public class SessionCounter implements HttpSessionListener {
private static int activeSessions = 0;
public void sessionCreated(HttpSessionEvent se) {

activeSessions++;
}
public void sessionDestroyed(HttpSessionEvent se) {
if(activeSessions > 0){

activeSessions--;
}
}
public static int getActiveSessions() {
return activeSessions;
}
}
... la clase la metemos en el WEB-INF/classes/com/stardeveloper/web/listener/SessionCounter.class

Para que tire debemos tocar el web.xml del WEB-INF/ de nuestra aplicacion incorporando este bloque ...

<listener>
<listener-class>
com.stardeveloper.web.listener.SessionCounter
</listener-class>
</listener>

pero cuidando donde lo metemos pues el orden de los tags de este fichero es importante, en el original no se aclara este tema, copio mi web.xml a modo de ejemplo ....

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">

<web-app>
<display-name>Nombre de tu aplicacion</display-name>

<!-- Listeners -->
<listener>
<listener-class>com.stardeveloper.web.listener.SessionCounter</listener-class>
</listener>


<!-- lo que ya tengais en el web.xml -->

</web-app>

Revisad la version de la DTD, yo tenia la web-app_2.2.dtd y arrojaba error, la cambie por esta sin mas y sanseacabo .... restart Tomcat y ya ....

El codigo del jsp encargadod e mostrar la info es algo asi ...

<%@page language="java" import="com.stardeveloper.web.listener.SessionCounter" contentType="text/html; charset=ISO-8859-1" %>
<html>
<head>
</head>
<body>

Usuarios conectado:<%= SessionCounter.getActiveSessions() %>

</body>
</html>

Debeis abrir nuevas ventanas del navegador para chequear que funciona (nada de Ctrl + u) ... la suma la hace instantaneamente, lo de la resta (cuando se destruye una session), por lo menos a mi me va mas lenta y hay que esperar un instante para que la realice, meted una salida de sistema dentro de la clase para chequear que esta entrando por cada uno de los metodos (session Created() y session Destroyed() segun el caso) ... algo asi como System.out.println("Entro en .... "); vereis que funciona ....

Cualquier duda escribidme, prometo responder ..... :)

Y gracias Ken x el interes ....

Eu