Wie kann ich einen Benutzer automatisch von allen geöffneten Registerkarten abmelden, wenn sich der Benutzer in einer davon abmeldet?

Lesezeit: 6 Minuten

Benutzer-Avatar
Rushil K. Pachchigar

Ich habe neben vielen anderen Seiten 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 weitergeleitet. 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 befindet sich in jedem Seitenfuß:

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

  • Vielleicht möchten Sie einen Blick auf stackoverflow.com/questions/28230845/… werfen.

    – Punktdruck

    15. Februar 2017 um 15:48 Uhr

  • Mögliches Duplikat von Alle geöffneten Tabs automatisch abmelden, wenn sich der Benutzer in einem davon abmeldet

    – Vivek Nerle

    3. Mai 2017 um 6:14 Uhr

Benutzer-Avatar
shukshin.ivan

Wann Ajax nützlich ist

Alle 3 Sekunden eine Ajax-Anfrage an Ihren Server zu stellen, ist nur dann nützlich, wenn 1. Sie Tabs in verschiedenen Browsern geöffnet haben 2. oder auf vielen Computern. 3. oder Sie verwenden sehr alte Browser

Cookie setzen funktioniert nicht.

Der Ansatz mit dem Setzen von Cookies funktioniert nicht, da eine Registerkarte geänderte Cookies in einer anderen Registerkarte nicht kennt. Das liegt daran document (woher Cookies mit getCookie kommen) von Tab A ändert sich nicht ohne Anfrage an einen Server. Sie können zwei Registerkarten von SO öffnen und versuchen, sie einzustellen setCookie('name', 'val', 1) in einem Tab und betrachten document.cookie in der anderen Registerkarte.

Wie man andere Registerkarten erstellt, wusste sofort über die Abmeldung Bescheid

Wenn Sie alle Registerkarten desselben Browsers abmelden müssen, wäre es großartig, Signale zwischen den Registerkarten zu übertragen. Es gibt ein paar Methoden, über deren Verwendung ich Ihnen erzählen möchte localStorage (Demo hier).

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

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

Jeder andere Tab bekommt es mit einem Listener.

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

Was wäre, wenn alte Browser ohne localStorage

Sie können beide Ansätze verwenden – localStorage und automatisch aktualisieren, zum Beispiel alle 60 Sekunden, nur um sicherzustellen, dass es funktioniert, wenn Tabs auf verschiedenen Computern geöffnet werden. Wenn localStorage funktioniert nicht (sehr alte Browser), automatische Aktualisierung alle 3 Sekunden.

Das folgenden Geigenshows Wie man damit umgeht.

Was sonst?

Sie können verwenden node.js + socket.io 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 zu handhaben als eine gewöhnliche jQuery.

  • Danke @shukshin.ivan für die Antwort, es funktioniert für mich 🙂

    – Rushil K. Pachchigar

    14. Februar 2017 um 10:52 Uhr

  • Gute Antwort. Großes Problem auf meiner Website gelöst. Vielen Dank Alter!

    – Savanne S

    24. Juli 2019 um 11:23 Uhr

  • Eine weitere Anerkennung an shukshin.ivan für die Mühe, diese Antwort zu veröffentlichen.

    – jan199674

    27. September 2019 um 14:36 ​​Uhr

  • Denken Sie daran, dass MDN sagt: „Dies funktioniert nicht auf derselben Seite, die die Änderungen vornimmt – es ist wirklich eine Möglichkeit für andere Seiten in der Domain, den Speicher zu verwenden, um alle vorgenommenen Änderungen zu synchronisieren.“

    – Karlius

    16. August 2020 um 21:15 Uhr

  • Genial! Vielen Dank.

    – Ashish Tripathi

    10. November 2021 um 14:41 Uhr

Benutzer-Avatar
ANIK ISLAM SHOJIB

Betrachten wir etwas, dass Sie eine PHP-Sitzung verwenden und den folgenden Code jedes Mal überprüfen, 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 also wahrscheinlich so etwas: unset($_SESSION[‘username’]); und session_destroy();

Wenn Ihre Seite diese überprüfende PHP-Datei aufruft, werden Sie im Gegenzug false finden und der folgende Benutzer wird keinen Zugriff mehr von jedem Browser und von allen Seiten erhalten. Und zum automatischen Abmelden versuchen Sie dies

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

Hinweis: Sie müssen festlegen $inactive = 6000;(zum Beispiel) als globale Variable beim Login

Dafür haben Sie zwei Möglichkeiten. Speichern Sie entweder die Sitzungswerte auf dem Server und stellen Sie häufig Ajax-Anforderungen an den Server, um zu überprüfen, ob der Benutzer noch angemeldet ist oder nicht. Dies führt jedoch zu einer enormen Serverlast und verbraucht auch Netzwerkbandbreite des Benutzers. Oder aber,

Überprüfen Sie häufig, ob das angemeldete Cookie noch vorhanden ist oder nicht im Browser. Das wird der gute Ansatz sein.

Beides kann von durchgeführt werden setTimeout oder setInterval

Aber der zweite sollte gut sein.

  • Das Überprüfen von Cookies wird auch von setTimeout oder setInterval während des gesamten Ajax-Aufrufs durchgeführt?

    – Rushil K. Pachchigar

    9. Februar 2017 um 3:44 Uhr

  • Sie müssen setTimeout oder setInterval verwenden, um Cookies zu überprüfen, aber Sie müssen keinen Ajax-Aufruf machen. Cookie kann auf Clientseite über Javascript selbst überprüft werden.

    – Sagar V

    9. Februar 2017 um 4:30 Uhr

  • Ohne Interval oder Timeout können Sie nicht feststellen, ob der Benutzer abgemeldet ist oder nicht

    – Sagar V

    9. Februar 2017 um 4:30 Uhr

  • muss ich das mit ajax machen?

    – Rushil K. Pachchigar

    9. Februar 2017 um 4:50 Uhr


Benutzer-Avatar
Sagar V

Hier ist, was Sie brauchen. In diesem,
Snippet zeigt einen Fehler, von dem ich nicht weiß, warum. Kopieren Sie also bitte den Javascript-Code in die Browserkonsole (f12) und überprüfen Sie ihn. Es klappt
Bei der Benutzeranmeldung müssen Sie verwenden

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

Hier setzen wir ein Cookie namens eingeloggt

 
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="https://stackoverflow.com/questions/42111784/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);">
  

Ajax fordert den Server häufig auf, zu überprüfen, ob der Benutzer noch angemeldet ist oder nicht. Aber das wird machen eine enorme Serverlast und verbrauchen auch Netzwerkbandbreite des Benutzers

die Belastung des Servers deaktiviert diese Option. Ich habe es getestet.

1228560cookie-checkWie kann ich einen Benutzer automatisch von allen geöffneten Registerkarten abmelden, wenn sich der Benutzer in einer davon abmeldet?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy