it-swarm.com.de

Wie der Benutzer sich automatisch von allen geöffneten Registerkarten abmeldet, wenn sich der Benutzer bei einem von ihnen abmeldet

Ich habe unter anderem eine Anmeldeseite erstellt, die Code zum Überprüfen der Sitzung enthält. Wenn der Benutzer keine Sitzung hat, werden alle Seiten neu geladen und zur Abmeldeseite umgeleitet. Dieses Skript wird alle drei Sekunden aufgerufen. 

Der Code, den ich geschrieben habe, funktioniert gut, aber ich möchte ihn auf andere Weise implementieren. Wenn sich der Benutzer abmeldet, werden alle geöffneten Registerkarten neu geladen/aktualisiert, wodurch der Benutzer abgemeldet wird. Ist das möglich?

sessioncheck.php :

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

Dieser Code steht in jeder Seitenfußzeile:

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

Wenn ajax nützlich ist

Alle drei Sekunden eine Ajax-Anforderung an Ihren Server zu senden, ist nur für den Fall hilfreich 1. Sie haben Registerkarten in verschiedenen Browsern geöffnet 2. oder in vielen Computern . 3. oder Sie verwenden sehr alte Browser

Das Setzen des Cookies funktioniert nicht.

Ein Ansatz, der das Setzen von Cookies verwendet, funktioniert nicht, da auf einer Registerkarte keine Änderungen in einer anderen Registerkarte vorgenommen werden. Das liegt an document (wo Cookies mit getCookie abgerufen werden) von Tab A ändert sich nicht ohne Anforderung an einen Server. Sie können zwei Registerkarten von SO öffnen und versuchen, setCookie('name', 'val', 1) auf einer Registerkarte festzulegen und document.cookie auf der anderen Registerkarte anzuzeigen.

Wie mache ich, dass andere Registerkarten sofort über das Abmelden informiert wurden

Wenn Sie alle Registerkarten des gleichen Browsers abmelden möchten, ist es empfehlenswert, Signale zwischen Registerkarten weiterzuleiten. Es gibt ein paar Methoden, die ich Ihnen erzählen möchte, wie Sie localStorage ( demo hier ) verwenden.

Sie können einen Listener an ein storage-Ereignis anhängen (das ausgelöst wird, wenn das Speicherelement geändert wird) und ein logout-event-Signal senden.

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

Jede andere Registerkarte erhält es mit einem Listener.

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

Was ist, wenn alte Browser ohne localStorage

Sie können beide Ansätze verwenden - localStorage und Auto-Refresh, zum Beispiel alle 60 Sekunden. Nur um sicherzustellen, dass es funktioniert, wenn Registerkarten auf verschiedenen Computern geöffnet werden. Wenn localStorage nicht funktioniert (sehr alte Browser), wird alle 3 Sekunden automatisch aktualisiert.

Die folgende Geige zeigt wie man damit umgeht.

Was sonst?

Sie können node.js + socket.io verwenden, um Signale zwischen allen Browsern eines Benutzers zu senden. Es funktioniert schnell und meldet einen Benutzer auf jedem Gerät ab, aber es ist etwas schwieriger als mit einer herkömmlichen jQuery.

45
shukshin.ivan

wir betrachten einige Dinge, die Sie PHP-Sitzung verwenden, und Sie überprüfen den folgenden Code jedes Mal, wenn Sie Ihre Seiten laden, oder nach einiger Zeit 

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

In Ihrer logout.php-Datei machen Sie wahrscheinlich etwas wie dieses unset ($ _ SESSION ['username']); und session_destroy ();

Wenn Ihre Seite also das Aufrufen von php anruft, werden Sie im Gegenzug falsch angezeigt und der folgende Benutzer erhält keinen Zugriff mehr von einem Browser und von Seiten. Und für die automatische Abmeldung versuchen Sie dies 

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

Hinweis: Sie müssen $inactive = 6000; (beispielsweise) als globale Variable während der Anmeldung festlegen

2

Hier ist was Sie brauchen. In diesem Snippet wird ein Fehler angezeigt. Ich weiß nicht warum . Kopieren Sie daher den Javascript-Code in die Browserkonsole (f12) und überprüfen Sie ihn. Es funktioniert Wenn sich der Benutzer anmeldet, müssen Sie verwenden

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

Hier setzen wir einen Cookie, der als eingeloggt bezeichnet wird

 
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

Dazu haben Sie zwei Möglichkeiten: Entweder speichern Sie die Sitzungswerte auf dem Server und stellen häufig Ajax-Anforderungen an den Server, um zu prüfen, ob der Benutzer noch angemeldet ist oder nicht .. __ Dies führt jedoch zu einer großen Serverlast und dazu verbrauchen die Netzwerkbandbreite des Benutzers .

Überprüfen Sie, ob das angemeldete Cookie immer noch vorhanden ist oder nicht häufig im Browser angezeigt wird ..__ Dies ist der richtige Ansatz .

Beide können mit setTimeout oder setInterval ausgeführt werden.

Aber der zweite sollte gut sein.

0
Sagar V

Ajax fragt regelmäßig an den Server, ob der Benutzer noch .__ ist. eingeloggt oder nicht. Aber dies macht eine riesige Serverlast und auch verbrauchen Netzwerkbandbreite des Benutzers

das Laden des Servers deaktiviert diese Option. Ich habe es getestet.

0
Apul