Je sais que cela a une grande chance d'être marqué comme doublon, mais je n'ai pas pu trouver exactement ce que je cherche
Il s'agit d'un problème courant et je suis sûr qu'il contient une solution de bonnes pratiques bien définie
Contexte
Une application SaaS d'une seule page, a beaucoup de glisser-déposer, l'utilisateur peut interagir avec elle sans beaucoup de communication avec le serveur pendant des périodes de temps
La session serveur contient uniquement l'objet utilisateur, à l'aide d'un cookie de session non persistant
La session expire sur le serveur après X heures
Certaines choses sont chargées uniquement lors de la connexion
Problème
- L'utilisateur travaille sur l'application, une fois terminé, l'utilisateur ne se déconnecte pas, laisse simplement le navigateur ouvert
- L'utilisateur revient après plus de X heures (la session est invalidée sur le serveur)
- L'utilisateur interagit avec l'application sans avoir besoin d'une connexion au serveur (fait glisser et laisse tomber des choses, modifications de texte ...)
- Seulement lors de la prochaine interaction avec le serveur (supposons qu'il n'y a pas de sauvegarde automatique), l'utilisateur est renvoyé à la page de connexion et perd une partie de son travail
Solutions possibles
Voici quelques solutions que j'ai en tête, j'aimerais savoir s'il y en a d'autres et s'il y a quelque chose de fondamentalement mauvais avec l'une d'entre elles.
1. Ne déconnectez jamais l'utilisateur
- Comment? soit garder une longue session, garder un cookie persistant, ou ping "keep alive" javaScript
- Avantages : l'utilisateur n'a besoin de s'inquiéter de rien, résout le problème pour lui
- Inconvénients : non conforme PCI, non sécurisé et nécessite des modifications de développement, par exemple, les éléments chargés dans la session uniquement lors de la connexion de l'utilisateur doivent passer à un sous-modèle de publication (écoute des modifications d'événements) ou avoir un délai d'expiration du cache.
2. Stockage local
- Comment? utiliser un nouveau stockage local pour stocker temporairement l'état en cas de déconnexion, rediriger vers la page de connexion, persister une fois connecté
- Avantages : également une base pour la prise en charge du «travail hors ligne», pas seulement la gestion du délai d'expiration de la session
- Inconvénients : plus difficile à mettre en œuvre, besoin de fusionner l'état de l'arborescence de données, tous les navigateurs ne prennent pas en charge
3. Sauvegarde automatique
Chaque action utilisateur qui modifie le modèle doit persister immédiatement (ou via une sorte de file d'attente côté client), par exemple, si elle coche une case à cocher, modifie un champ de texte ou fait glisser et déposer quelque chose, une fois qu'elles sont terminées, persiste les modifications.
- Comment? Utilisez un framework MV ** (Backbone.js / Knockout.js / Ember.js / Angular.js, etc.) pour lier le modèle et persister sur les modifications.
- Avantages : semble une solution propre, la session est active tant que l'utilisateur est actif, aucun travail côté client n'est effectué sans le persister.
- Inconvénients : la dernière action que l'utilisateur effectue après la fin d'un délai d'expiration de session.
4. Déconnectez l'utilisateur après l'expiration de la session
cela peut avoir plusieurs approches
Demandez au serveur "la session a expiré" - c'est un peu un problème avec le chat de Schrodinger, car la simple question au serveur prolonge la session (redémarre le délai),
- Comment? Soit avoir un serveur qui prend en charge une telle question (je n'en connais pas, mais je viens de Java) ou, on peut simplement garder une table des ID de session, et le dernier temps d'accès manuellement, et demander au serveur en passant la session ID en tant que paramètre au lieu du cookie, je ne sais pas si cela est même possible, mais cela semble dangereux, peu sûr et de mauvaise conception quelle que soit la page de connexion, persistez une fois connecté
- Avantages : S'il y avait une telle prise en charge native sur les serveurs, cela ressemble à une question claire et légitime (demander si l'utilisateur X a toujours une session ou non sans la renouveler si c'est le cas)
- Inconvénients : si le serveur ne le prend pas en charge (et encore une fois, je ne sais pas si un serveur ou un framework possède cette fonctionnalité), la solution de contournement présente potentiellement d'énormes risques de sécurité.
Une solution de contournement que j'ai entendu est d'avoir une courte session côté serveur et un ping côté client en vie, qui a un nombre maximal de pings
- Comment? Session courte sur le serveur, le client envoie une requête ping à chaque sessionTimeOut / 2, avec un nombre maximal de tentatives de Y.
- Avantages : sorte de résoudre le problème, rapide et sale
- Inconvénients : se sent comme un hack, gérer le renouvellement de la session vous-même au lieu de laisser le serveur le faire
Minuterie côté client
Comment? Ayez un temporisateur côté client et synchronisez-le avec celui du serveur en le redémarrant à chaque demande pour qu'il soit égal au délai d'expiration de la session serveur maximale moins un remplissage, après que l'utilisateur n'envoie aucune demande au serveur, l'interface utilisateur affiche une "session est sur le point d'expirer, voulez-vous continuer? " (comme vous l'avez fait sur les services bancaires en ligne)
Avantages : résout le problème
- Inconvénients : Je ne peux penser à aucun, sauf au besoin de s'assurer que la synchronisation fonctionne
La question
Il me manque probablement quelque chose dans l'analyse ci-dessus, je pourrais avoir des erreurs stupides, et j'aimerais votre aide pour les corriger. Quelles autres solutions puis-je avoir pour cela?
now
. 4.2 semble être un excellent moyen de tuer votre serveur et d'augmenter les coûts 4.3 Sur Android, lorsque je reviens à l'écran d'accueil, je suis presque sûr que le processus est en pause et que cela pourrait également interférer avec le minuteur côté client.