web-dev-qa-db-fra.com

Comment l'utilisateur se déconnecte automatiquement de tous les onglets ouverts lorsqu'il se déconnecte de l'un d'entre eux

J'ai créé une page de connexion, parmi beaucoup d'autres, qui contient du code pour vérifier la session. Si l'utilisateur n'a pas de session, toutes les pages seront rechargées et redirigées vers la page de déconnexion. Ce script est appelé toutes les trois secondes. 

Le code que j'ai écrit fonctionne bien, mais je veux le mettre en œuvre d'une autre manière. Lorsque l'utilisateur se déconnecte, tous les onglets ouverts sont rechargés/actualisés, ce qui entraîne la déconnexion de l'utilisateur. Est-ce possible?

sessioncheck.php :

<?php
session_start();
if(isset($_SESSION['username']) && $_SESSION['username'] != ''){
    echo "true";
}
else {
    echo "false";
}
?>

Ce code est dans chaque pied de page:

<script>
    function gettatus(){
        $.get("sessioncheck.php", function(data){
            if(!data) {
                window.location = "logout.php";
            }
            setTimeout(function(){
                checkLoginStatus();
            }, 3000);
        });
    }
    $(document).ready(function(){
        gettatus();
    });
</script>
19
Rushil Pachchigar

Quand ajax est utile

Faire une requête ajax sur votre serveur toutes les 3 secondes est utile au cas où 1. vous avez ouvert des onglets dans différents navigateurs 2. ou dans de nombreux ordinateurs . 3. ou vous utilisez de très vieux navigateurs

Le paramétrage du cookie ne fonctionne pas.

L'approche utilisant le cookie de configuration ne fonctionne pas car un onglet n'est pas conscient des cookies modifiés dans un autre onglet. C'est à cause de document (d'où proviennent les cookies avec getCookie) de l'onglet A ne change pas sans demander à un serveur. Vous pouvez ouvrir deux onglets de SO et essayer de définir setCookie('name', 'val', 1) dans un onglet et consulter document.cookie dans l'autre onglet.

Comment faire en sorte qu'un autre onglet connaisse immédiatement la déconnexion

Si vous devez vous déconnecter de tous les onglets du même navigateur, il serait intéressant de faire passer des signaux entre les onglets. Il y a plusieurs méthodes, je veux vous parler de l'utilisation de localStorage ( demo here ).

Vous pouvez attacher un écouteur à un événement storage (déclenché lorsque l'élément de stockage est modifié) et envoyer un signal logout-event.

localStorage.setItem('logout-event', 'logout' + Math.random());

Tous les autres onglets l'obtiendront avec un auditeur.

window.addEventListener('storage', function(event){
    if (event.key == 'logout-event') { 
        // ..
    }
});

Et si les anciens navigateurs sans localStorage

Vous pouvez utiliser les deux approches - localStorage et régénération automatique, par exemple toutes les 60 secondes, pour vous assurer que cela fonctionne lorsque des onglets sont ouverts sur différents ordinateurs. Si localStorage ne fonctionne pas (très vieux navigateurs), actualisez automatiquement toutes les 3 secondes.

Le violon suivant montre comment y faire face.

Quoi d'autre?

Vous pouvez utiliser node.js + socket.io pour envoyer des signaux entre tous les navigateurs d’un utilisateur. Il fonctionne rapidement et déconnecte un utilisateur de chaque périphérique, mais il est un peu plus difficile à gérer qu’un jQuery commun.

45
shukshin.ivan

permet de considérer que vous utilisez une session php et que vous vérifiez le code suivant à chaque chargement de vos pages ou après un certain temps 

<?php
    session_start();
    if(isset($_SESSION['username']) && $_SESSION['username'] != '')
        echo true;
    else 
        echo false;
?>

Donc, sur votre fichier logout.php, vous faites probablement quelque chose comme ceci unset ($ _SESSION ['nomutilisateur']); et session_destroy ();

Par conséquent, lorsque votre page appellera cette vérification php, vous obtiendrez false en retour et l'utilisateur suivant n'aura plus accès à aucun navigateur ni page. Et pour vous déconnecter automatiquement, essayez ceci 

$sessionTTL = time() - $_SESSION["timeout"];
if ($sessionTTL > $inactive) {
    session_destroy();
    unset($_SESSION['username']);
    echo false;

Remarque: vous devez définir $inactive = 6000; (par exemple) en tant que variable globale lors de la connexion.

2
anik islam Shojib

Voici ce dont vous avez besoin. Dans ce, extrait indique une erreur, je ne sais pas pourquoi . Alors, veuillez copier le code javascript sur la console du navigateur (f12) et le vérifier. Cela fonctionne Lorsque l'utilisateur se connecte, vous devez utiliser

setCookie('loggedin','true',1);

Ici, nous installons un cookie appelé connecté

 
function setCookie(cookiename, cookievalue, expdays) {
  var d = new Date();
  d.setTime(d.getTime()+(expdays * 24 * 60 * 60 * 1000));
  var expires = "expires=" + d.toUTCString();
  document.cookie = cookiename + "=" + cookievalue + "; " + expires;
}
function getCookie(cookiename) {
  var name = cookiename + "=";
  var startPos = document.cookie.indexOf(name);
  if(startPos == -1) return null;
  startPos+=(name.length);
  if(document.cookie.indexOf(";",startPos) == -1){
    return document.cookie.substring(startPos,document.cookie.length);
  }
  else{
    return document.cookie.substring(startPos,document.cookie.indexOf(';',startPos));
  }
return null;
}


function checkCookie() {
   var loggedin = getCookie("loggedin");
   if (loggedin && loggedin !=null) {
     // Logged in
     //do  nothing
   }
   else{
     window.location.href="login.php";
   }
}
<!-- use the below code in logged in home page to check whether the user is logged in still or not in a time interval of 1 second. Change 1000 as per your need.//-->
<body onload = "setTimeout(checkCookie,1000);">
  

1
Sagar V

Pour cela, vous avez le choix. Deux options sont disponibles: stocker les valeurs de session sur le serveur et adresser fréquemment des requêtes Ajax au serveur pour vérifier si l'utilisateur est toujours connecté ou non . consommer la bande passante réseau de l'utilisateur ..__ Ou sinon,

vérifiez que le cookie connecté existe toujours ou pas fréquemment dans le navigateur . Ce sera la bonne approche .

Les deux peuvent être exécutés par setTimeout ou setInterval

Mais le second devrait être bon.

0
Sagar V

Ajax demande fréquemment au serveur de vérifier si l'utilisateur est toujours connecté ou pas. Mais cela fera une charge de serveur énorme et aussi consommer la bande passante du réseau de l'utilisateur

la charge sur le serveur désactive cette option. Je l'ai testé.

0
Apul