Restringir aplicación web en una sola ventana

publicado por: Anonymous

Tengo un sistema de gestión de personas en el lugar donde trabajo, que permite (como casi toda página) que pueda tenerla abierta en varias pestañas.

Pero hay un problema: algunos de los datos que guarda son en base a variables de sesión y si por ejemplo los ejecutivos abren 5 personas diferentes en 5 pestañas diferentes, las cinco personas se guardarán con la misma información de sesión de la primera persona. En base a esto, necesito que el sistema no permita abrir la aplicación en una nueva pestaña o ventana, es decir, que solo pueda trabajarse en una sola pestaña.

No se me ocurre que página haga esto, alguien me dijo que Netflix tiene esa funcionalidad, pero no sé cómo hacerlo. ¿Alguien lo ha hecho y puede orientarme?¿Cómo podría evitar que se abran múltiples ventanas y restringir la aplicación web a una sola ventana?

solución

Si lo que quieres es detectar si una nueva pestaña/ventana se ha abierto, lo que puedes mostrar un mensaje de error si es una pestaña/ventana nueva. Para ello puedes usar el historial de JavaScript y comprobar que no haya ningún elemento antes.

Algo se se podría hacer así:

// si el historial tiene menos de dos páginas, es una nueva pestaña/ventana
if (history.length < 2) { 
    // Estás es una nueva pestaña/ventana: realiza las acciones necesarias
}

Entonces si pones eso al principio de tu página, sabrás si es una pestaña/ventana nueva y podrás actuar en consecuencia:

  • Muestra mensaje de error
  • Esconde los datos que se iban a mostrar
  • Cierra la ventana

O las acciones que quieras hacer. Pero recuerda que esto es JavaScript, un usuario con conocimientos será capaz de saltarse esta comprobación (aunque realmente si lo hace va a funcionar mal, por lo tanto no tiene mucho sentido).


Otra opción sería permitir que los usuarios abran más de una pestaña. Si ya lo hacen y es cómo ellos usan la aplicación, quizás sea más fácil para ellos permitir múltiples ventanas en lugar de restringir el número a una sola.

Me imagino que te estás refiriendo a variables de sesión en el lado del servidor, que serán compartidas en todas las diferentes ventanas que tenga abiertas el usuario y por eso tienes el problema: aunque abras múltiples pestañas/ventanas, todas van a compartir los datos.

Se me ocurren al menos dos maneras de permitir que el usuario pueda tener más de dos pestañas/ventanas abiertas con información de sesión diferente en cada una (no sé cómo lo hace Netflix y no tengo Netflix para ver qué hace):

  1. Identificar de manera unívoca cada pestaña/ventana y asociar la información de sesión a esa ventan/pestaña.

    Cuando el usuairo inicie sesión le asignarías un ID a la ventana y luego, cada vez que se cargue una página, comprobarías si es una pestaña/ventana nueva con JavaScript (puedes hacerlo mirando el tamaño del historial). En el servidor guardarías la información de sesión asociada a esos IDs que pasarías al servidor con las peticiones para que el contenido sea personalizado a esa pestaña/ventana concreta.

  2. En lugar de usar variables de sesión en el servidor, usa sessionStorage en JavaScript. Son variables de sesión en el lado del cliente y según la documentación oficial (traducción mía):

    Si el usuario tiene abiertas múltiples ventanas del sitio, cada una tendrá su propia copia del objeto de almacenamiento de sesión

    Entonces cada pestaña/ventana tendría información personalizada (pero tendrías que pasarla al servidor para que sepa qué debe mostrar.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *