Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour tout le monde,
ma question est : comment peut en expirer une page qui reste inactif pour certain temps et lorsque elle sera expirer une redirection automatique vers une autre page .
j'ai essayer
Zend_Session::rememberMe(300); Zend_Session:: destroy(); if (Zend_Session:: isDestroyed() ){ $this->_redirect('index/login'); }
mais le navigateur n'attend pas 300 seconds il fait le redirection automatique.
alors il y a t'il quelqu'un qui peut m'aider !!!!!!!!!!!!
merci d'avance.
Dernière modification par 0866 (07-03-2012 12:21:10)
Hors ligne
Salut, si je prend ton code à la lettre je dirais que c'est normal puisque tu détruis la session juste après lui avoir donné un timeout.
Si c'est dans le but de nous montrer les différentes fonctions que tu as utilisé, je te conseil d'utiliser Zend_Session::regenerateId() et penser à faire un Zend_Session::start(). Si je me souviens bien dans la doc il est indiqué que c'est nécessaire.
Hors ligne
Merci ,
mais j met le zend_session::start dans mon code ,
voici le code de mon controller Index :
public function init() { /* Initialize action controller here */ $this->db = Zend_Db::factory('Oracle', array( 'username' => '****', 'password' => '****', 'dbname' => '*****' )); Zend_Db_Table_Abstract::setDefaultAdapter($this->db); $config = array( 'name' => '******', 'primary' => '*****', 'modifiedColumn' => '*****', 'dataColumn' => '*****', 'lifetimeColumn' => '******' ); Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config)); // Démarrage de la session Zend_Session::start(); }
dans la page index si la page reste inactif pendant un certain temps la session doit être expirer et en redirige l'utilisateur vers la page login pour s'identifier de nouveau. public function indexAction() { Zend_Session::rememberMe(300); Zend_Session:: destroy(); if (Zend_Session:: isDestroyed() ){ $this->_redirect('index/login'); } }
la première chose l'utilisateur va se connecter a l'application si son login et password validées il va se redireger vers la page index .
public function loginAction() { // If data was sent if(isset($_POST['login']) && !empty($_POST['login'])) { $user_model = new session2_MODEL_User($this->db); $message = $user_model->login($_POST['login'], $_POST['pass']); if (true === $message ) { // Successfully $this->_redirect('index'); } else { $this->view->assign('errors', $message); } } }
Dernière modification par 0866 (05-03-2012 11:24:24)
Hors ligne
Alors il y a bien un truc que je comprend pas ... Lis les commentaires.
[lang=php] public function indexAction() { Zend_Session::rememberMe(300); // Tu demandes 300 secondes de timeout Zend_Session:: destroy(); // Tu DETRUIS la session if (Zend_Session:: isDestroyed() ){ // Forcément la session est détruire donc tu passes dans le if et tu es redirigé $this->_redirect('index/login'); } }
Hors ligne
mon ideé c'est d'expirer la session après un certain temps (si la page index reste inactif pendant un abs de temps) et après l'expiration je redirige l'utilisateur vers la page login.
et j ne sait pas comment j doit l’implémenter.
Hors ligne
Bah pas comme ça .
Si on décrypte ce qui se passe lorsque tu es sur la page index de ton contrôleur on a ça :
- J'indique à la session qu'elle doit se souvenir de moi pendant 300 secondes, soit 5 minutes
- Je détruis la session
- Si j'ai détruit la session je redirige.
Tu vois bien que tu fais un truc de trop, si tu demandes à la session de se souvenir de toi pendant 300 secondes mais que tu la détruis juste après lui avoir demandé ça ne sert à rien de lui dire de se souvenir de toi. La solution c'est donc de ne pas faire tout ça dans la même requête.
C'est lorsque l'utilisateur s'authentifie et que tu enregistre la session qu'il faut lui indiquer au bout de combien de temps elle expire et uniquement à cet endroit. Ensuite à toi de mettre en place un système d'autorisation et de vérification sur les contrôleurs qui nécessitent d'être connecté.
Pour ça tu peux faire un contrôleur générique qui va gérer ça et étendre tous tes contrôleurs avec cette classe là, du coup, à chaque requête tu vas pouvoir vérifier si la session est valide. Si l'utilisateur ne fait rien pendant 5 minutes, la session aura expiré et tu pourras alors faire la redirection que tu souhaites.
Je te conseil de lire la doc officielle qui est très bien faite sur les sessions : http://framework.zend.com/manual/fr/zend.session.html
Hors ligne
dans l'action index j changé le code comme ce si:
[lang=php] Zend_Session::rememberMe(15*60); //attend 15 mn if (!Zend_Session::sessionExists()){ Zend_Session:: destroy(); $this->_redirect('index/pagetwo'); }
donc si la page reste inactif pour 15mn j fait la redirection vers une autre page.
mais cette redirection n se fait pas automatique si seulement si j fait actualiser la page (après 15mn).
est ce que il y a un truc qui doit l'ajouter ???
et comment j puisse faire informer l'utilisateur qui la page va être expiré après 15mn?
merci d’avance.
Hors ligne
En fait il y a des choses que je ne comprend pas très bien dans ta démarche. (C'est des choses à vérifier car j'en suis pas certain mais ça serait de la logique).
[lang=php] Zend_Session::rememberMe(15*60);
Permet de dire que tu veux que la session soit enregistrée pour 15 minutes. Cette information est envoyée avec un timeout à ton serveur web. Si l'utilisateur est inactif plus de 15 minutes alors le serveur va supprimer la session et ne pourra donc plus la retrouver. La session a donc expiré. Tu n'as donc pas besoin (en théorie) de faire un Zend_Session::destroy();
Ensuite ce qui ne va pas c'est que tu fais tout ça dans la même "action". Lorsque l'utilisateur va arriver sur ta page il va exécuter tous le code présent dans ton contrôleur (en tenant compte des ifs etc ...). Donc là ta page ne devrait pas expirer (à moins que tu fasses des choses au dessus que tu ne montres pas). Puisque dans l'ordre tu fais ça :
- J'indique à la session de rester active 15 minutes
- Je vérifie si la session n'existe pas
- Si elle existe pas je détruis la session (mais pourquoi détruire quelque chose qui n'existe pas ? (à confirmer mais ça me semble pas très logique qu'elle ne soit pas détruite toute seule))
- Si elle existe pas alors je redirige l'utilisateur
Le problème c'est qu'à chaque fois qu'un utilisateur va consulter ta page tu lui dis de garder la session 15 minutes. De ce fait elle ne devrait jamais expirer puisque même après 1h00 d'inactivité si je recharge la page tu demandes à la session de rester active 15 minutes et ensuite tu vérifies si elle existe. Elle devrait donc toujours exister puisque tu lui demandes toujours avant d'exister.
Je pense que tu as un problème de conception à ce niveau là. Sois tu créés la session via un formulaire de connexion et dans ce cas le Zend_Session::rememberMe(15*60); doit être dans ta fonction de connexion soit c'est une page spécifique qui ne peux être active qu'un certain temps et dans ce cas mettre en place un système qui va gérer la session sur cette page uniquement (je ne vois pas trop comment faire comme ça, car tu dois vérifier si la session existe, si elle existe pas la créer pour 15 minutes et si elle expire rediriger mais si elle a expiré elle n'existe plus, donc ça boucle ... A moins qu'il y ai moyen de différencier session inexistante de session expirée).
Si on reste sur l'idée de la session créée via un formulaire de connexion, tu as juste à laisser le code que tu as fait (en testant si le destroy() a une réelle utilité) et en retirant le rememberMe(15*60).
Pour informer l'utilisateur que la page va expirer après 15 minutes, tu peux l'indiquer directement sur la page, via le flashMessenger, etc ...
La page ne pourra pas être redirigée toute seule sans rien faire avec PHP. Tu peux le faire avec du javascript ou en modifiant une balise d'entête de ce genre (à voir comment le faire avec zend)
[lang=php] <meta http-equiv="refresh" content="REDIRECT_TIME_EN_SECONDES -> 15*60";URL=DESTINATION_URL" />
Ceci va déclencher une redirection au bout de X secondes. Il faut que tu remplaces REDIRECT_TIME_EN_SECONDES par ton temps soit 15*60 + 1 secondes pour être au delà des 15 minutes et DESTINATION_URL par la page vers laquelle tu veux rediriger l'utilisateur.
Dernière modification par Orkin (07-03-2012 11:45:38)
Hors ligne
Merci bq Orkin,
suite a votre recommandation qui tu a me donné.
j résolu mes problèmes
Hors ligne
Pages: 1