5

¿Hay alguna manera de verificar que mi página no se abra en otra pestaña o ventana en IE? Supongamos que tengo una página1 y el usuario acierta a una "nueva ventana", que abrirá una nueva ventana con la misma página abierta. Entonces ahora hay dos instancias de la página. Quiero restringir el navegador para que solo tenga una instancia de la página abierta en cualquier momento.Cómo detectar que la misma página ya está abierta en otra ventana en IE

Uno de los requisitos es que los usuarios deben poder actualizar la página y aún estar en el mismo estado dentro de la aplicación. Por lo tanto, los tokens de una sola vez no son adecuados.

No estoy seguro de que haya alguna manera de distinguir entre una actualización de página y una nueva ventana abierta, es por eso que estoy preguntando.

P.S. Esto no es para un sitio web normal, y entiendo que hacer esto normalmente sería intrusivo y malvado. Hay un caso fuerte para hacer esto aquí, ya que es una aplicación web masiva.

+1

... ¿qué pasa con otros navegadores? –

+2

"Quiero restringir el navegador para que solo tenga una instancia de la página abierta en un momento dado" ¿Qué problema particular es este comportamiento bastante incómodo y no intuitivo destinado a abordar? Seguramente hay una mejor manera? – spender

+1

Estoy de acuerdo con el derrochador, esto parece muy intrusivo. En realidad, hay una cantidad sorprendente de personas que no entienden lo suficiente la navegación por pestañas como para saber * si ya tienen otra abierta en la misma página: ¿qué van a hacer? –

Respuesta

4

La mejor manera de implementar esto es tener un token del lado del servidor (muchos bancos hacen esto) que se regenera en cada solicitud y se debe pasar de nuevo para que las páginas funcionen.

Así que, básicamente:

  1. anexar un token generado a cada enlace (como parte de la cadena de consulta)
  2. Cualquier solicitud que reciba que no contiene el token puede ser considerado válido.
  3. generar un nuevo token en cada pedido, por lo que sólo el 1 token es válido en cualquier 1 vez
+6

Acabo de actualizar la página. Oops. – spender

+0

También debe gestionar la actualización de la página, por lo que no es aceptable. –

+0

Eso realmente tiene sentido si genera un token en document.load. Estamos enviando solicitudes constantemente, por lo que solo podemos detectar solicitudes que se envían desde el mismo usuario, pero con 2 tokens diferentes y responder con un redireccionamiento a una de ellas. –

0

La única manera que se me ocurre es que cada página cree una cookie que identifique la página y su tiempo de acceso, con un tiempo de caducidad de solo unos segundos o minutos (ajuste al gusto), y con carga de su sitio (o carga de página) verificando si existe esa cookie.

Psuedo-código:

if (cookie exists) { 

Page already loaded in another tab/window. 

} 

else { 

write cookie 

} 

possiby se podría utilizar algún tipo de identificador de sesión, basada en algo no único. Tal vez con la dirección IP del usuario, nombre de usuario y sal? La desventaja de usar solo la dirección IP es que todos los usuarios detrás de un enrutador comparten esa misma dirección, el beneficio de acoplarlo con el nombre de usuario es que es al menos único por usuario y se usa para seguridad básica (puede que no sea todo eso). importante para ti, pero aún así parece una buena práctica), y evita que un usuario sea bloqueado porque 'tiene otra ventana abierta' en alguna parte.

Como arriba, verifique si la ID de la sesión existe, y, si no, entonces créela.

Según lo observado por @Spender, en los comentarios a su pregunta y a otra respuesta, cualquier solución que implemente esto tiene al menos un problema de personas que no pueden actualizar la página. Lo que al menos reduce el tiempo de cookies, pero no de una manera que no impida que los usuarios se irriten.


Editado:

Para hacer frente a la necesidad de la página-refresh, supongo que se podría utilizar el onUnload (o de .unload jQuery) para destruir la cookie, por lo que se retira para el usuario dejando/refrescando la página.

El js que ejecuta onUnload también se puede usar para eliminar la variable de sesión, por Ajax, o simplemente por la cookie del lado del cliente.

Cuestiones relacionadas