Pregunta

Estoy realizando modificaciones en un sitio basado en miembros cuyo propietario quiere poder rastrear el tiempo que pasan en el sitio (inicio / cierre de sesión) para todos los usuarios en un servidor de base de datos. Iniciar sesión es fácil; hay un punto de entrada (el formulario de inicio de sesión) y, como resultado, los inicios de sesión pueden iniciarse en la base de datos tan pronto como sucedan.

Sin embargo, los cierres de sesión son un poco más complicados, ya que a menos que el usuario haga clic en 'cerrar sesión' para informarnos explícitamente que están dejando que la solución se vuelve más complicada (¿y con qué frecuencia los usuarios realmente hacen clic en cerrar sesión? ) Una posibilidad (solo en términos de seguimiento del tiempo total en el sitio) sería registrar cada carga de página en la base de datos y asociarla con el usuario que la cargó; El problema con eso es que el sitio es un sitio de entrega de video basado en membresía (¡no es lo que estás pensando!) y su última visita a la página probablemente será un video de veinte o treinta minutos. También necesitamos capturar el tiempo dedicado a esa última página, no solo el tiempo que se cargó.

He pensado en dos posibles soluciones, ninguna de las cuales es tan elegante. El primero sería atrapar todos los eventos de 'descarga' a través de javascript y registrar una llamada a 'logout.php' (suponiendo que XMLHttpRequest o lo que sea no muera tan pronto como se descargue la página); El problema es que los enlaces internos también se registran como eventos de descarga, por lo que al hacer clic en cualquier enlace se cerrará la sesión del usuario (puede verificar un indicador en el controlador 'descargar' y tener todos los enlaces internos configurados para ese indicador, lo que no es difícil de hacer dinámicamente, pero un poco torpe). El otro enfoque implicaría establecer un intervalo para hacer ping a la base de datos cada 60 segundos más o menos, lo que nos permite saber que el usuario todavía está en el sitio, y luego hacer algunos cálculos al extraer el historial del usuario para calcular la duración total de esa sesión ; eso también parece algo hackish. Además, ninguna de estas soluciones funciona para usuarios con JS deshabilitado.

Parece que este problema no es tan inusual, y tiene que haber una mejor manera; ¿Existe un enfoque de mejores prácticas para resolver esto? Si no, ¿ve alguna forma de mejorar alguna de estas soluciones?

¿Fue útil?

Solución

La web no está diseñada para permitir un seguimiento preciso de los eventos de cierre de sesión. No está garantizado que reciba una notificación del navegador cuando el usuario se cierre, por lo que, en circunstancias normales, lo mejor que puede esperar es atrapar el evento de tiempo de espera de la sesión, y ese evento podría no activarse hasta 20 minutos después de que el usuario abandonó la página .

Ahora podría mejorar un poco esto al poner una solicitud ajax en un temporizador en cada página (tal vez una o dos veces por minuto) para proporcionar un `` latido del corazón '', pero esto también tiene algunas advertencias: debe hacer asegúrese de que la sesión eventualmente se agote y aún no tiene la garantía de que el usuario no bloqueará estas solicitudes, quizás deshabilitando JavaScript.

Otros consejos

He tenido buen éxito con el uso del temporizador en javascript para hacer ping al servidor. En mi caso, el sitio requiere JavaScript, por lo que esto no es un problema. También utilizo este mecanismo para realizar una verificación que impide que una sola cuenta inicie sesión desde dos máquinas diferentes, por lo que hay razones más convincentes para hacer este truco.

Una cosa a tener en cuenta con la descarga es que todavía no está garantizado que el evento de descarga siempre se active. Tendrá personas en las computadoras portátiles que, por ejemplo, solo cierran la computadora portátil, por lo que el enfoque del temporizador probablemente será un poco más preciso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top