Node Express Connect – Gestion de session

J’ai écrit un pilote de magasin de session pour ArangoDB pour ConnectJS. Cela fonctionne, même si encore beaucoup en alpha, mais j’ai quelques questions.

Les premières sessions ayant un atsortingbut expires “false” ne restnt que pour la durée de l’agent utilisateur. J’ai remarqué que session.destroy () n’est pas appelé lorsque la fenêtre du navigateur est fermée. Il en résulte une session “abandonnée” dans le magasin. Comment puis-je les éliminer efficacement? Existe-t-il un moyen de rechercher et de détruire les sessions abandonnées sur une base programmée?

Deuxièmement, j’ai mis en place la configuration minimale requirejse pour mon magasin de session, comme indiqué sur cette page: http://www.senchalabs.org/connect/session.html (près du bas)

Ce serait obtenir, définir et détruire. Les deux autres méthodes recommandées sont length et clear. Que doivent faire exactement ces méthodes? Je suppose que length renvoie la durée d’activité d’une session? En quoi «clair» est-il différent de détruire? Merci!

Sauf si vous avez configuré un événement sur le client pour informer le serveur que la fenêtre se ferme, le serveur n’aurait aucun moyen de savoir que la session n’est plus utilisée.

Vous voulez penser mentalement aux sessions en deux parties. Une partie est le jeton (le cookie) qui est passé entre le noeud et le navigateur. La seconde est la persistance réelle des sessions dans un magasin (le MemoryStore de base ou Redis, ou votre nouveau magasin de session pour une autre firebase database). Tout le code de la session de connexion est en train de les faire correspondre à chaque demande.

  • Rechercher un cookie de session
  • S’il en existe un, essayez de le rechercher dans le magasin.
  • Rendre les données récupérées du magasin disponibles pour la demande
  • À la fin de la demande, mettez à jour les informations de durée de vie du cookie.
  • Ecrivez la session au magasin

Notez que, sauf si vous utilisez le MemoryStore, Node n’a pas les données de session en mémoire, sauf si votre demande est en cours d’exploitation. (Eh bien, ce serait en mémoire pendant un certain temps, mais serait non référencé et sujet à la récupération de place). Lorsque vous réfléchissez à divers scénarios de déploiement, cela a du sens.

Ainsi, le travail d’expiration des sessions côté serveur incombe au magasin lui-même. Une des raisons pour lesquelles Redis est formidable, c’est parce qu’il gère les éléments expirants de manière automatique, ce que vous pouvez voir que connect-redis dans ses opérations définies :

  RedisStore.prototype.set = function(sid, sess, fn){ sid = this.prefix + sid; try { var maxAge = sess.cookie.maxAge , ttl = this.ttl , sess = JSON.ssortingngify(sess); ttl = ttl || ('number' == typeof maxAge ? maxAge / 1000 | 0 : oneDay); debug('SETEX "%s" ttl:%s %s', sid, ttl, sess); this.client.setex(sid, ttl, sess, function(err){ err || debug('SETEX complete'); fn && fn.apply(this, arguments); }); } catch (err) { fn && fn(err); } }; 

Vous pouvez voir qu’il divise TTL par 1000 car il utilise des secondes plutôt que des millis pour son expiration. Le magasin de session MongoDB le plus populaire utilise la fonctionnalité TTL de MongoDB de la même manière.

C’était donc un long chemin à faire que vous utilisiez votre moteur de firebase database pour assurer automatiquement l’expiration des sessions côté serveur ou que vous deviez implémenter l’expiration vous-même. Vous pourriez avoir un processus qui le fait en dehors de votre application de noeud (peut-être un autre processus de noeud) ou l’implémentation de votre magasin pourrait installer une tâche SetInterval pour le vérifier et le nettoyer périodiquement. Par exemple, un magasin de session basé sur MySQL ne fait que

En ce qui concerne la deuxième partie de votre question, que font la length et la clear ? Le commentateur a raison de dire que RedisStore ne les implémente pas et qu’ils peuvent probablement être ignorés en toute sécurité. Cependant, vous pouvez voir leurs implémentations dans le code source de MemoryStore . Pas trop excitant.

clear vide toutes les sessions et le rappel si un rappel est fourni:

 MemoryStore.prototype.clear = function(fn){ this.sessions = {}; fn && fn(); }; 

length appelle simplement le nombre de sessions dans le magasin:

 MemoryStore.prototype.length = function(fn){ fn(null, Object.keys(this.sessions).length); }; 

J’espère que c’était utile.