Sé que esto tiene una gran posibilidad de ser marcado como duplicado, pero no pude encontrar exactamente lo que estoy buscando.
Este es un problema común y estoy seguro de que tiene una solución de mejores prácticas bien definida
Antecedentes
Una aplicación SaaS de una sola página, tiene una gran cantidad de arrastrar y soltar, el usuario puede interactuar con ella sin mucha comunicación del servidor por períodos de tiempo
La sesión del servidor solo contiene objetos de usuario, utilizando una cookie de sesión no persistente
La sesión caduca en el servidor después de X horas
Algunas cosas se cargan solo durante el inicio de sesión
Problema
- El usuario trabaja en la aplicación, cuando termina, el usuario no cierra la sesión, solo mantiene el navegador abierto
- El usuario regresa después de más de X horas (la sesión se invalida en el servidor)
- El usuario interactúa con la aplicación sin necesidad de una conexión de servidor (arrastra y suelta cosas, ediciones de texto ...)
- Solo en la siguiente interacción del servidor (supongamos que no hay guardado automático) el usuario es arrojado a la página de inicio de sesión y pierde parte de su trabajo
Soluciones posibles
Aquí hay algunas soluciones que tengo en mente, me gustaría saber si hay alguna otra, y si hay algo fundamentalmente malo con alguna de ellas.
1. Nunca desconecte al usuario
- ¿Cómo? ya sea mantener una sesión larga, mantener una cookie persistente o hacer ping de Java Keep "mantener vivo"
- Pros : el usuario no necesita preocuparse por nada, soluciona el problema por ellos
- Contras : no es compatible con PCI, no es seguro y necesita cambios de desarrollo, por ejemplo, las cosas cargadas a la sesión solo en el inicio de sesión del usuario deben pasar a un submodelo de pub (escuchar los cambios de eventos) o tener un tiempo de espera de caché.
2. Almacenamiento local
- ¿Cómo? use el nuevo almacenamiento local para almacenar temporalmente el estado si está desconectado, redirigir a la página de inicio de sesión, persistir una vez que haya iniciado sesión
- Pros : También es base para el soporte de "trabajar sin conexión", no solo para manejar el tiempo de espera de la sesión
- Contras : más difícil de implementar, es necesario hacer una fusión de estado del árbol de datos, no todos los navegadores admiten
3. Guardado automático
Cada acción del usuario que cambie el modelo debe persistir de inmediato (o mediante algún tipo de cola del lado del cliente), por ejemplo, si marcan una casilla de verificación, cambian un campo de texto o arrastran y sueltan algo, una vez que terminan, persisten los cambios.
- ¿Cómo? Use un marco MV ** (Backbone.js / Knockout.js / Ember.js / Angular.js, etc.) para vincular el modelo y persistir en los cambios.
- Pros : Parece una solución limpia, la sesión está activa mientras el usuario esté activo, no se realiza ningún trabajo del lado del cliente sin persistir.
- Contras : la última acción que realiza el usuario después de perder el tiempo de espera de una sesión.
4. Cierre la sesión del usuario después de que expire la sesión
esto puede tener varios enfoques
Pregúntele al servidor "ha caducado la sesión" - esto es un poco complicado 22 / El gato de Schrodinger, ya que la mera pregunta al servidor extiende la sesión (reinicia el tiempo de espera),
- ¿Cómo? O tiene un servidor que admite esa pregunta (no sé de ninguno, pero vengo de Java Land) o, simplemente puede mantener una tabla de ID de sesión y el último tiempo de acceso manualmente, y preguntar al servidor pasando la sesión ID como parámetro en lugar de la cookie, no estoy seguro de si esto es posible, pero suena peligroso, inseguro y tiene un mal diseño. La página de inicio de sesión persiste una vez que ha iniciado sesión
- Pros : si existiera tal soporte nativo en los servidores, parece una pregunta limpia y legítima (preguntar si el usuario X todavía tiene una sesión o no sin renovarla si es así)
- Contras : si el servidor no lo admite (y, una vez más, no sé si algún servidor o marco tiene esta funcionalidad), entonces la solución alternativa tiene enormes riesgos de seguridad.
Una solución alternativa que he escuchado es tener una sesión corta en el lado del servidor y un ping del lado del cliente para mantener vivo, que tiene un número máximo de pings
- ¿Cómo? Sesión corta en el servidor, el cliente hace ping cada sesión TimeOut / 2, tiene reintentos máximos de Y.
- Pros : tipo de soluciona el problema, rápido y sucio
- Contras : se siente como un pirata informático, manejando la renovación de la sesión usted mismo en lugar de dejar que el servidor lo haga
Temporizador del lado del cliente
¿Cómo? Tenga un temporizador en el lado del cliente y sincronícelo con el servidor reiniciando en cada solicitud para que sea igual al tiempo de espera máximo de la sesión del servidor menos algo de relleno, después de que el usuario no envíe ninguna solicitud al servidor, la interfaz de usuario muestra un "sesión es a punto de terminar, ¿quieres continuar? " (como lo tiene en la banca en línea)
Pros : soluciona el problema
- Contras : no se me ocurre ninguno, excepto la necesidad de asegurarme de que la sincronización funcione
La pregunta
Probablemente me estoy perdiendo algo en el análisis anterior, podría tener algunos errores tontos, y me gustaría su ayuda para corregirlos. ¿Qué otras soluciones puedo tener para esto?
now
. 4.2 suena como una excelente manera de matar su servidor y aumentar los costos 4.3 En Android, cuando regrese a la pantalla de inicio, estoy bastante seguro de que el proceso está en pausa y que también podría interferir con el temporizador del lado del cliente.