11484 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

J'ai un site qui utilise intégralement une navigation ajax.
Lorsqu'un utilisateur est inactif trop longtemps, sa session expire et je voudrais pouvoir détecter cela.
Il y a la solution d'ajouter dans tous mes scripts php (appelés par l'ajax) un test pour savoir si la session est expirée et qu'il renvoi un mot précis que je vais interpréter dans le résultat de l'ajax.
Mais j'avoue que cette solution me saoule d'avance je n'avais pas pensé à ça et le faire sur la centaine d'appels ajax qui peuvent exister sur mon appli risque de me prendre un certain temps.

Est-ce que quelqu'un voit une autre solution qui pourrait m'aider et qui serait plus simple à mettre en place ?

Merci d'avance pour vos réponses
Smiley eek Il y a un problème d'architecture dans ton programme, que tu ais une centaine d'appels AJAX différents, ok, mais il faut toujours avoir un seul point d'entrée coté serveur, c'est à dire un seul script php qui analyse la requête, les paramètres, .... la session aussi ..... puis effectue l'action demandée et retourne le résultat.

C'est le principe utilisée dans les architecture MVC qui sont fortement recommandées d'un point de vue sécurité mais aussi lisibilité du code.

Maintenant que tu as une centaine de scripts çà va être un peu compliqué de changer le comportement de tous les scripts sans tous les changer.

Une solution, éventuellement :
1 - dans le .htaccess tu détectes si la requete est une requete AJAX :

RewriteCond %{HTTP:X-Requested-With} !=XMLHttpRequest
RewriteCond %{HTTP:X-REQUESTED-WITH} !^(XMLHttpRequest)$

2 - si c'est une requete AJAX tu rediriges vers un script php unique : (routeurAjax.php par exemple)
3 - dans RouteurAjax.php tu analyses la requete, tu regardes si la session est valide, si oui tu renvoies vers l'URL initialement appelée, donc vers l'un de tes centaines de scripts, et si la session n'est pas valide tu retournes un message approprié.

Bon ce sont les principes généraux, y'a surement des adaptations à effectuer, je te laisses chercher ou voir s'il y a d'autres solutions.
Est-ce qu'il ne serait pas plus facile d'envoyer une requête « heartbeat » pour indiquer régulièrement au serveur que l'utilisateur est toujours connecté et qu'il ne doit pas faire expirer la session ?

Sinon, une autre technique souvent utilisée, si tu sais par exemple que la session expire après 20 minutes, c'est de faire apparaître un message après 18 ou 19 minutes (entièrement côté client) pour dire à l'utilisateur que sa session va bientôt expirer et lui donner un moyen de la prolonger manuellement.
requête « heartbeat », pourquoi pas, mais la question de cyrakuse n'était pas "comment éviter que la session expire", mais "comment détecter que la session a expiré".

Si une session php expire c'est peut-être que ce comportement est voulu, pour des raisons de sécurité, un peu comme la mise en veille windows qui redemande un mot de passe.

Mais bon .... c'est à l'auteur du post de voir ce qui répond vraiment à son besoin avec les pistes qu'on lui a données.
Modifié par Zebrou (21 Sep 2014 - 21:15)
Bonjour à tous,

merci pour vos réponses.

J'ai finalement opté pour une toute autre solution.
En effet, j'utilise la fonction suivante :
$(document).ajaxSuccess(function() {
})


Cette fonction s'éxecute à chaque ajax. Par conséquent, j'utilise cette fonction pour vérifier que la réponse de l'ajax ne soit pas "DECO" par ex. Si c'est le cas, je redirige vers la page de login.

Pour mes fichiers php qui envoient les réponses à l'ajax, j'ai un fichier qui est "include dans tous. J'ai donc ajouté dans ce fichier une vérif de la session avec un echo "DECO" et un exit.

Ainsi, à chaque requète ajax (peu importe laquelle), le résultat va être "DECO" si la session n'est plus active.

Avec cette solution, je n'ai pas eu besoin de remanier tout mon code et cela reste léger.


J'avais penser à envoyer une requête ajax à intervalle régulier pour vérifier la session, mais cette solution me paraissait un peu lourde pour être utilisée en production.


Pour ce qui est du routeur ajax, je ne connaissait pas cette façon de procéder. Peux-tu me dire en quoi cela est plus sécurisé ? Car si tous les contrôles sont bien fait à chaque fois, je ne vois pas où est le problème ?! Et puis dire "les framework le font donc c'est comme ça qu'il faut faire", je ne suis pas certains de la chose : les framework ne sont pas toujours des modèles à suivre sur certains points. Smiley murf

En tout cas merci à tous, même si vos solutions ne m'ont pas servi aujourd'hui, elles restent dans un coin de ma tête pour un projet futur dans lequel cela pourrait être mieux adapté
bonsoir,

le modèle MVC n'est pas un framework, c'est un canevas de développement, certains frameworks l'utilisent, d'autres non. Je t'incite a aller voir les quelques cours ou tutos qui traitent du MVC.

Pour ce qui est du routeur ajax, c'est moi qui l'appelait comme çà pour l'exemple. L'idée c'est simplement d'avoir un seul et même fichier php qui reçoit toutes les requetes ajax, qui vérifie la requete, les droits utilisateurs, les données de session, etc .... et une fois que tu as fait tous ces tests, tu peux appeler la fonction ou le fichier php externe qui va effectuer ta requete, et tu retournes le résultats, idéalement par ton fichier php qui a reçu la requete.

Avantages :
- moins de code : les controles n'apparaissent que dans un fichier
- moins de sources de bugs du coup
- meilleure lisibilité
- meilleure flexibilité, si un jour tu veux retourner du JSON au lieu du XML ou inversement, il y a un seul fichier à modifier, et si tu veux rajouter un test sur les requetes pareil
- meilleure sécurité, tu n'expose qu'un seul fichier php à l'utilisateur, une seule porte d'entrée quoi, donc plus facile à sécuriser que des centaines de fichiers php.