Nous avons eu le même soucis et la seule solution potable fut de créer un système de frame donc l'une sera invisible et porteuse de l'évènement onBeforeUnload. Lorsque l'utilisateur ferme la fenêtre, un message apparaît (tu ne peux pas vraiment le personnaliser juste ajouter quelques lignes) et selon l'option choisie par l'utilisateur tu lances ton script php de déconnexion "propre".Bonjour,
Je souhaiterai qu'un utilisateur ne puisse se connecter qu'une seule fois à la fois avec le même login. J'y arrive avec un bouton de deconnexion en mettant à jour ma BDD mais si l'utilisateur ferme son navigateur, je perd l'information et mon utilisateur apparaut toujours connecté dans ma base.
J'essaierai d'être un peu plus précis quand j'en aurais le temps, promisJe te remercie mais pourrais-tu être plus précis?
De plus il me semble que l'evénement OnBeforeOnload est un événement seulement géré par IE et pas par Firefox?
David.
<frameset rows="*,18">
<frame name="main" frameborder="0" src="main.php" title="contenu"></frame>
<frame name="footer" frameborder="0" noresize="noresize" scrolling="no" src="footer.php" title="bas de page"></frame>
</frameset>
Ma frame footer doit récupérer les 2 évènements onBeforeUnload et onUnload:
<body onBeforeUnload="return message();" onUnload="confirmLogOut();">
L'évènement onBeforeUnload aura lieu car l'utilisateur va fermer la fenêtre. Alors une pop up de confirmation générique lui posera la question s'il souhaite vraiment fermer la fenêtre. S'il dit non alors la fenêtre ne se ferme pas, s'il répond oui alors le navigateur va fermer la fenêtre et donc déclencher l'évènement onUnload. Et c'est à partir de cet évènement que tu pourras lancer un script php et de notre côté on a pris le parti d'utiliser Ajax pour réaliser la déconnexion et fermer la fenêtre.
// au début d'index.php
session_start();
if ($_SESSION['connected']) {
// on met à jour la dernière fois qu'il a été vu actif
mysql_query('UPDATE users SET dernieractif = NOW() WHERE username = "'.$_SESSION['username'].'"');
}
// dans login.php
$res = mysql_query('SELECT 1 FROM users WHERE DATE_ADD(dernieractif, INTERVAL '.$timeout.' MINUTE) > NOW() AND username = "'.$_POST['username'].'"';
if (mysql_num_rows($res) > 0) {
die('vous êtes déjà connecté');
}
// dans logout.php
mysql_query('UPDATE users SET dernieractif = "0000-00-00 00:00:00" WHERE username = '.$_SESSION['username']);Je ne vois pas en quoi c'est bugué et non sécurisé?![]()
Toute tentative de gestion des session côté client sera au mieux buggée, au pire non sécurisée.
Ok je vois. Cela dépend du contexte alors car dans mon cas il s'agit d'une application intranet (et pour envahisseur aussi) donc on peut se permettre d'avoir certaines exigences de configuration.S'il me prend l'envie d'accéder à ton site en passant outre les frames (typiquement parce que j'ai mis une page particulière en favori en passant par le clic droit, et donc le frameset sautera la prochaine fois que je viendrai), ou pire : si j'ai désactivé javascript (environ 5% des navigateurs actuellement), le principe ne fonctionnera pas.
Et on se retrouvera avec des fantomes éternels.
le problème est le même si un utilisateur de l'intranet a mis dans des marques-pages une url sans la frame. Je deconseille aussi cette méthode je préfère gèrer ça avec des timestamps. Quand l'utilisateur affihce une page on stock l'heure d'affichage, pour voir les membres en ligne je fixe une durée par exemple 10 minutes et je cherche dans la BD les utilisateurs qui ont consultés une page dans les 10 dernières minutes.Ok je vois. Cela dépend du contexte alors car dans mon cas il s'agit d'une application intranet (et pour envahisseur aussi) donc on peut se permettre d'avoir certaines exigences de configuration.S'il me prend l'envie d'accéder à ton site en passant outre les frames (typiquement parce que j'ai mis une page particulière en favori en passant par le clic droit, et donc le frameset sautera la prochaine fois que je viendrai), ou pire : si j'ai désactivé javascript (environ 5% des navigateurs actuellement), le principe ne fonctionnera pas.
Et on se retrouvera avec des fantomes éternels.