L’application que je développe pour Engiby utilises un système d’authentification. Et vu que certaines données peuvent être assez sensibles, on m’a demandé de faire un logout automatique après un certain temps. Voici comment je l’ai réalisé.
L’évènement clé de cette astuce est le déplacement de la souris dans l’application (mouseMove). A chaque mouvement de la souris, je remet un compteur à sa valeur initial, exemple 300 (secondes). En parallèle j’utilise un Timer qui se déclenche toutes les secondes et qui décrémente ce compteur. Si le compteur arrive à zéro alors j’appelle une méthode qui fera le logout.
Premièrement voici ma classe AcctivityChecker :
public class ActivityChecker { protected var listener:Function; protected var timer:Timer; /** * Notre compteur */ protected var counter:int; /** * La valeur initial de notre compteur */ protected var counterLimit:int = 300; public function ActivityChecker(listener:Function){ this.listener = listener; counter = counterLimit; timer = new Timer(1000); timer.addEventListener(TimerEvent.TIMER, timerUpdate); timer.start(); } /** * On remet le compteur à sa valeur initiale */ public function userActif():void{ if(timer.running){ counter = counterLimit; } } /** * On retourne l'état actuel du coteur * Utile si vous voulez faire un décompte */ public function getTime():int{ return counter; } /** * Est-ce que le compteur est encore actif ? */ public function isRunning():Boolean{ return timer.running; } /** * Appelé toutes les secondes */ protected function timerUpdate(e:TimerEvent):void{ counter--; if(counter<0){ timer.stop(); listener.call(this); } } }
Pour un effet sur l’ensemble du programme, il faut utiliser l’événement mouseMouve de l’Application. Voici comment l’utiliser :
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="500" minHeight="500" mouseMove="mouseMoveHandler()"> <fx:Script> <![CDATA[ protected var activityCheck:ActivityChecker; /** * Une fois le login effectué */ protected function onLoginHandler():void{ activityCheck = new ActivityChecker(userAway); } protected function mouseMoveHandler():void{ if(activityCheck!=null) activityCheck.userActif(); } protected function userAway():void{ //action de déconnexion } ]]> </fx:Script> <!-- ... --> </s:Application>
On appelle cette classe uniquement quand un utilisateur est logué. Une fois logué le timer décrémente gentiment le compteur. Une fois le compteur terminé la méthode userAway() est appelée.