Evitar múltiples instancias de una aplicación web

Mi inquietud es saber si existe la manera de validar que una aplicación web(ej. http://mi/ servidor/inventory) tenga una sola instancia en el cliente, me explico teniendo la aplicación abierta en una pestaña del explorador, entonces si copio y pego el url en otra pestaña o en cualquier lugar me debería decir que ya abrió la aplicación y terminar el proceso.
De ser posible hacer esta validación. ¿Cómo lo haría? He pensado en los cookies pero ellos están ligados a un explorador determinado. También en un campo en la base de datos que marque la ip o una estrategia parecida pero eso correría en el servidor. Y quiero una validación con más peso hacia el cliente, obviamente el servidor debe controlarlo también pero con menos incidencia.
En fin, donde veo mayor dificultad es en validar que cuando se haga la petición a la url determinar si ya hay una instancia de la aplicación corriendo en la PC del cliente.
Toda sugerencia y/o ayuda de su parte será muy bienvenida...

1 respuesta

Respuesta
1
No creo que puedas controlarlo en el cliente, porque no va a ser fiable al 100%. Me explico: yo tengo instalados 5 browsers distintos (IExplore, Firefox, Chrome, Safari y Opera), y cada uno guarda sus cookies donde quiere. Por tanto la única estrategia que se me ocurre es tener en el servidor una lista de las IPs que se conectan a tu aplicación, con un timer que haga que cada 5 segundos (por ejemplo) la IP se borre de la lista de IPs conectadas. Cada instancia de la aplicación deberá invocar (mediante ajax dentro de un setInterval() por ejemplo) a una función del servidor que resetee el timer, para decir "¡hey, que sigo aquí!!". Si no quieres usar ajax, siempre puedes usar un iframe oculto, y cargar en él una página que sólo contenga javascript, con un setInterval('invocaServidor()', 3000) por ejemplo.
Además, en el método de invocación al servidor, le tendrás que pasar el sessionid, o un número aleatorio creado en la primera llamada del cliente al servidor, para controlar que la instancia del browser que está invocando al servidor sea la misma que lo invocó la primera vez, y no otra distinta (otra instancia del mismo browser, u otro browser distinto).
A lo mejor mi explicación es un poco liosa... leela un par de veces y si tienes alguna duda me vuelves a preguntar.
Espero que te haya orientado algo (al menos).
Primero que todo muchas gracias por el apoyo.
Con respecto a tu sugerencia tengo ciertas acotaciones. Entiendo perfectamente tu posición con respecto a lo de la variedad de browsers es muy cierto. La verdad llevo rato tratando de idear una estrategia efectiva para hacer la validación y hasta ahora todo ha terminado en fracaso :), ya lo considero como un reto personal.
Me enfoco en la parte del cliente por cuestiones de velocidad, opino que en vista de la situación hay que hacer una validación que involucre tanto al cliente como al servidor, haciendo que el ultimo sea el auditor final.
Bueno me parece buena idea lo de un historial de ip, aunque me inclino que debe ser usada la mac address de cada cliente(pregunto,¿es posible capturar la mac address del cliente?), esto para evitar la salvedad de que es posible de que varios clientes comparten la misma IP pública.
Lo que no entiendo aún es porque borrar la ip del servidor cada 5 segundos, la otra operación es consecuencia de está. A mi parecer no es eficiente.
En todo caso la esencia de la dificultad es validar que al hacer una petición de la URL al servidor, no permita que se cargue una segunda instancia de la aplicación web. Ojo no me refiero a las sesiones de usuario, es algo más estricto, implica que el cliente solo tenga una única instancia.
Sé que es bastante difícil pero bueno tengo Fe de que es posible.
Por lo menos para limitar el alcance de lo que se quiere, validar inicialmente que exista una única instancia de la aplicación para cada browser en el cliente.
Reitero mis agradecimientos por la ayuda y bueno cualquier otra sugerencia será muy bien recibida.
Saludos totales
La MAC address del cliente no se puede obtener de un modo sencillo, ya que creo que no va en la cabecera http de la petición hacia el servidor. Se podrían intentar chapuzas varias, pero si tus clientes corren bajo diferentes sistemas operativos, la cosa se complica. Puedes intentarlo con un applet que ejecute algo como esto (válido si corre en Java 6), aunque puede que al cliente le salten todas las alarmas de seguridad de la JVM:
http://www.kodejava.org/examples/250.html
Respecto a lo de borrar cada 5 segundos la IP de la lista, es por lo siguiente: imagina que accedo a la aplicación con mi primera instancia de browser. El servidor testea la IP, y como no la tiene, dice "ok, pues la meto". Ahora el cliente cierra el browser. La IP sigue en el servidor, por lo que si el cliente accede otra vez, el servidor encuentra la IP en la lista y le deniega el acceso porque se cree que es una nueva instancia y que ya tiene una abierta. Por eso es necesario borrar la IP del servidor cada cierto tiempo, pero para que una IP se mantenga "viva", es necesario que el cliente le esté diciendo "sigo aquí... sigo aquí... sigo aquí...". No se si me explico...
Bueno, el tema es complicado como estamos viendo. Si tener una sola instancia es primordial para tu aplicación, a lo mejor deberías plantearte usar otra tecnología cliente-servidor que no se base en http y browsers.
Suerte y al toro ;-)
Carlos.
Cierto lo de la mac no esta fácil, estuve investigando un poco y es bastante complejo.
Bueno es un requerimiento obligatorio que la aplicación sea bajo ambiente Web.
Tendré que usar una estrategia consolidada de cookies, variables de sesión, y banderas en la base de datos. Sé que no será del todo efectiva pero mientras consigo la solución usaré esa estrategia.
¿Para terminar y disculpa mi insistencia, sabes de alguna manera de determinar que url's están abiertas en el browser(ej. Firefox)?
Pues la verdad es que no tengo ni idea. Lo siento :-(
Espero que encuentres una solución, y si puede ser, elegante.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas