Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je suis sur un petit projet qui comprend plusieurs modules et dans chaque module je crée les contrôleurs nécessaire et un contrôleur dédié aux requêtes Ajax.
Tous fonctionne super sauf quand la session de l'utilisateur expire et qu'il fait un appel Ajax.
Dans ce cas précis la requête n'aboutis mais peut créer une erreur selon le type de donnée renvoyé.
J'aimerais pouvoir annuler la requête Ajax et mette l'utilisateur sur la page de connexion.
Existe t il une solution simple que je pourrais mettre dans le script de contrôle d'accès type :
if(!$this->_acl->isAllowed(Zend_Registry::get('role'), $module.':'.$resource, $action)) { if($request->isXmlHttpRequest()){ // kill xmlHttpRequest // diriger l'utilisateur vers /default/index/index }else{ $request->setModuleName('default') ->setControllerName('index') ->setActionName('index'); } }
Merci,
Dede
Dernière modification par Dede (20-10-2010 18:29:05)
Hors ligne
Il faut que tu gères ça au niveau de ton javascript.
L'idéal c'est d'avoir un petit protocole de communication ajax.
Par exemple, a chaque requête erronée (peux importe la raison), t'envoie un code d'erreur avec un message et lorsque tu reçois ta réponse au niveau du javascript, tu regarde s'il y a eu une erreur, si oui tu l'affiches ou dans ton cas tu redirige vers le login, sinon tu fais le traitement normal.
Hors ligne
L'idée me parait séduisante,
mais je ne comprend pas l'histoire du protocole ?
J'ai une utilisation d'Ajax assez rudimentaire (je pense),
je fais mes requêtes de cette manière :
$.post(url,data,function(response){ //traite la réponse },'type') // ou $.get...
Comment mettre en place un protocole de communication?
Si tu as des liens de doc ou tuto je suis preneur.
Merci,
Dede
Hors ligne
Hello,
Je vois que tu utilises jQuery.
Tu peux spécifier un handler (une fonction) pour les erreurs serveur sur les requêtes ajax : http://api.jquery.com/ajaxError/
Ensuite il suffit de gérer les erreurs dans ta fonction, exemple vite fait :
var ajaxErrorHandler = function (event, XMLHttpRequest, settings, exception) { var response = jQuery.parseJSON(XMLHttpRequest.responseText); switch (XMLHttpRequest.status.toString()) { case '400': break; case '500': break; // ... } };
Il faut donc bien spécifier le code de la réponse côté serveur. De mon côté je passe l'objet réponse à mes vues JSON et dans les vues :
$this->response->setHeader('Content-Type', 'application/json'); if ($this->monObjet->getNotification()->hasErrors()) : $this->response->setHttpResponseCode(400); // bad request echo $this->json(array( 'data' => $this->monObjet, 'errors' => $this->monObjet->getNotification()->getErrors() )); else : $this->response->setHttpResponseCode(201); // ok created echo $this->json(array( 'data' => $this->monObjet, 'redirect' => $this->url(array( 'controller' => 'mon-controller', 'action' => 'mon-action' ), 'default', true) )); endif;
A toi de manipuler tout ça comme tu en as besoin.
A+ benjamin.
Hors ligne
Ça commence à rentrer...
Je vais me pencher sur cette méthode, c'est pas encore très clair mais ca devrais venir.
Merci,
Dede
Hors ligne
Alors après avoir été forcé de gratter ce sujet en "urgence",
j'ai finalement opté pour cette solution (que je poste, ça peut servir...):
Je ne gère que l'erreur ou le succès de la requête Ajax.
Dans le contrôleur de la page de connexion(/index/login):
... // Seul une erreur appel cette page de cette manière if($this->_request->isXmlHttpRequest()){ $this->_response->setHttpResponseCode('401'); } ...
et dans le script JS (accessible dans toute l'appli)
$.ajaxSetup({ complete:function(e, xhr) { if(xhr == 'error') { alert('Votre session à expiré.\nVeuillez vous reconnecter.') document.location.href = "/login"; } } });
Une chose que je ne comprend pas c'est que malgré le "setHttpResponseCode('401');" il me renvoit e.status = 500?
En tous cas cela fonctionne pour toutes les requêtes Ajax $.get, $.post, ...
Dede
Hors ligne