IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Déconnexion en fin de session


Sujet :

AJAX

  1. #1
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut [AJAX] Déconnexion en fin de session
    Bonjour,

    J'ai un site qui utilise Ajax sur la plupart des actions des utilisateurs.
    Le serveur php, au bout d'un certain temps d'inactivité, supprime la variable de SESSION, donc l'utilisateur est déconnecté.

    Ce que je souhaite, c'est lors d'une action de l'utilisateur, vérifier s'il est encore connecté ou pas et afficher un message en conséquence.

    Mais mon code renvoie undefined. Problème de délai de réponse ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    var xhr = null;
    var xhr_session = null;
    function getXhr(id_utilisateur, div_deconnexion) {
    	if (id_utilisateur == -1) {//on vérifie si on vient de la page de connexion, auquel cas il n'est pas nécessaire de vérifier si l'utilisateur est encore connecté (puisqu'il se connecte à l'instant !)
    		getXhr_session();
    	} else {
    		test = get_session(div_deconnexion);
    		alert('test : ' + test);                          <------ undefined
    		if (get_session(div_deconnexion) == 'true') {//sinon, pour chaque appel à ajax, on vérifie si l'utilisateur est connecté
    			alert('coucou3');
    			getXhr_session();
    		}
    	}
    }
    
    function getXhr_session() {
    	if(window.XMLHttpRequest) {// Firefox et autres
    		xhr = new XMLHttpRequest();
    	} else if(window.ActiveXObject) {// Internet Explorer 
    		try	{
    			xhr = new ActiveXObject("Msxml2.XMLHTTP");
    		}
    		catch (e) {
    			xhr = new ActiveXObject("Microsoft.XMLHTTP");
    		}
    	} else {// XMLHttpRequest non supporté par le navigateur 
    		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    		xhr = false;
    	}
    }
    
    function get_session(div_deconnexion) {
    	var retour = "retour";
    	if(window.XMLHttpRequest) {// Firefox et autres
    		xhr_session = new XMLHttpRequest();
    	} else if(window.ActiveXObject) {// Internet Explorer 
    		try	{
    			xhr_session = new ActiveXObject("Msxml2.XMLHTTP");
    		}
    		catch (e) {
    			xhr_session = new ActiveXObject("Microsoft.XMLHTTP");
    		}
    	} else {// XMLHttpRequest non supporté par le navigateur 
    		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    		xhr_session = false;
    	}
    	xhr_session.onreadystatechange = function() {
    		if(xhr_session.readyState == 4 && xhr_session.status == 200) {
    			response = xhr_session.responseText;
    			// alert ('coucou10 - ' + response);
    			if (response == 'nok') {
    				alert ('coucou11');
    				div_deconnexion.innerHTML = "<center>Vous avez &eacute;t&eacute; d&eacute;connect&eacute;(e) automatiquement.<p>Pour vous reconnecter, cliquez ici : <p><a href=\"http://dsi-support.dsic.mi\">Connexion à DSI</a></center>";
    				retour = false;
    			} else {
    				// alert ('coucou12');
    				retour = true;
    			}
    			alert(retour);
    			return retour;
    		}
    	};
    	xhr_session.open("POST","Script/Admin/Get_Session.php",true);
    	xhr_session.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhr_session.send(null);
    }

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test = get_session(div_deconnexion);
    alert('test : ' + test);
    get_session() envoie une requête synchrone, donc le reste du code continue à être interprété sans attendre le résultat de ta fonction.
    En règle générale, toutes les instructions liées au résultat d'une requête Ajax doivent être dans le callback (xhr.onreadystatechange) de celle-ci !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Merci pour la piste.
    Je pensais bien qu'il y avait quelque chose au sujet de la temporisation - synchronicité, mais je ne voyais pas pourquoi.

    J'ai essayé plusieurs choses, mais ça ne fonctionne toujours pas.

    Je vais préciser.
    Lorsque je clique sur un menu, je fais appel à cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    function affiche_page(id_utilisateur, div_deconnexion, affichesous_menu, divsousmenu, divpage, divmessage, lien, id_element) {
    	if (affichesous_menu == 0) {
    		divsousmenu.innerHTML = '';//on n'affiche pas le sous-menu
    	}
    	divmessage.innerHTML = 'Chargement de la page en cours... Veuillez patienter.';
    	divpage.innerHTML = '';
    	getXhr(id_utilisateur, div_deconnexion);
    	xhr.onreadystatechange = function() {
    		if(xhr.readyState == 4 && xhr.status == 200) {
    			response = xhr.responseText;
    			if (lien != 'admin') {
    				if (lien.substring(0,4) == 'suppr') {
    					divmessage.innerHTML = response;
    				} else {
    					divpage.innerHTML = response;
    				}
    			} else {
    				divsousmenu.innerHTML = response;
    			}
    			if (response == '') {
    				divmessage.innerHTML = 'Une erreur est survenue.';
    				divmessage.innerHTML += '<br>Affiche_Page.js';
    				divmessage.innerHTML += '<br>lien : ' + lien;
    				divmessage.innerHTML += '<br>id_element : ' + id_element;
    			} else {
    				divmessage.innerHTML = '';
    				if (affichesous_menu == 2) {//on utilise cette condition ici dans le cas de la relance dans la supervision; voir admin_supervision.js
    					divmessage.innerHTML = id_element;
    				}
    			}
    		}
    	};
    	xhr.open("POST","Script/Admin/Affiche_Page.php",true);
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhr.send("lien=" + lien + "&id_element=" + id_element);
    }
    La fonction getXhr(id_utilisateur, div_deconnexion) permet de vérifier si l'utilisateur est connecté et d'initialiser la variable xhr si c'est le cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    function erreur_ajax(divmessage, readyState, status, provenance) {
    	divmessage.innerHTML = 'Erreur de transmission de données.';
    	divmessage.innerHTML += '<br>xhr.readyState : ' + readyState;
    	divmessage.innerHTML += '<br>xhr.status : ' + status;
    	body = divmessage.innerHTML + "<br>Provenance : " + provenance;
    	divmessage.innerHTML = '<font color="red"><b>' + divmessage.innerHTML;
    	divmessage.innerHTML += "<br>Veuillez contacter l'<a href=\"mailto:admindsi@interieur.gouv.fr?subject=[DSI] Erreur&body=" + body + "\">administrateur</a> !</b></font>";
    	divmessage.innerHTML += '<p>';
    }
     
    //*******************************************************************************************************************************************************//
    //*A chaque appel d'ajax, on vérifie si l'utilisateur est connecté, car le serveur vide les variables de session régulièrement : on fait appel à Get_Session.php pour vérifier si la variable de session $_SESSION['user_id'] est remplie, auquel cas l'utilisateur est bien connecté
    //*******************************************************************************************************************************************************//
    function getXhr(id_utilisateur, div_deconnexion) {
    	var xhr = null;
    	var xhr_session = null;
    	if (id_utilisateur == -1) {//on vérifie si on vient de la page de connexion, auquel cas il n'est pas nécessaire de vérifier si l'utilisateur est encore connecté (puisqu'il se connecte à l'instant !)
    		getXhr_session();
    	} else {
    		get_session(div_deconnexion);
    	}
    }
     
    function getXhr_session() {
    	if(window.XMLHttpRequest) {// Firefox et autres
    		xhr = new XMLHttpRequest();
    	} else if(window.ActiveXObject) {// Internet Explorer 
    		try	{
    			xhr = new ActiveXObject("Msxml2.XMLHTTP");
    		}
    		catch (e) {
    			xhr = new ActiveXObject("Microsoft.XMLHTTP");
    		}
    	} else {// XMLHttpRequest non supporté par le navigateur 
    		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    		xhr = false;
    	}
    }
     
    function get_session(div_deconnexion) {
    	if(window.XMLHttpRequest) {// Firefox et autres
    		xhr_session = new XMLHttpRequest();
    	} else if(window.ActiveXObject) {// Internet Explorer 
    		try	{
    			xhr_session = new ActiveXObject("Msxml2.XMLHTTP");
    		}
    		catch (e) {
    			xhr_session = new ActiveXObject("Microsoft.XMLHTTP");
    		}
    	} else {// XMLHttpRequest non supporté par le navigateur 
    		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    		xhr_session = false;
    	}
    	xhr_session.open("POST","Script/Admin/Get_Session.php",true);// false pour mettre en synchrone --> on ne passe à l'instruction suivante que lorsque la réponse est arrivée.
    	xhr_session.onreadystatechange = function() {
    		if(xhr_session.readyState == 4 && xhr_session.status == 200) {
    			id_connecte = xhr_session.responseText;
    			if (id_connecte != "nok") {
    				// alert('response5 : ' + id_connecte);
    				getXhr_session();
    			} else {
    				// alert('response6 : ' + id_connecte);
    				div_deconnexion.innerHTML = "<center>Vous avez &eacute;t&eacute; d&eacute;connect&eacute;(e) automatiquement.<p>Pour vous reconnecter, cliquez ici : <p><a href=\"http://dsi-support.dsic.mi\">Connexion à DSI</a></center>";
    				return false;
    			}
    		}
    	};
    	xhr_session.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhr_session.send("");
    }
    Ce que je ne comprends pas, c'est qu'avec les alertes, ça fonctionne, mais sans, rien ne se passe.

    Je ne vois pas où ça coince.

  4. #4
    Membre actif
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 479
    Points : 281
    Points
    281
    Par défaut
    Les années sont passées, les framework Javascript se sont développés et facilitent le traitement du problème signalé.

    Je ferme cette discussion.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 4] Multi-sessions : fin de session (déconnexion)
    Par renaud26 dans le forum Langage
    Réponses: 4
    Dernier message: 07/02/2009, 16h56
  2. [AJAX] Ajax - Java - Fin de Session
    Par imhotep_zr7s dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 29/01/2009, 10h28
  3. [AJAX] détecter fin de session PHP en Javascript
    Par jason69 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/06/2008, 11h44
  4. detruire une cookie après fin de session
    Par MASSAKA dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 25/08/2005, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo