programing

사용자가 열려 있는 모든 탭에서 로그아웃할 때 사용자를 자동으로 로그아웃하려면 어떻게 해야 합니까?

coolbiz 2023. 3. 15. 23:08
반응형

사용자가 열려 있는 모든 탭에서 로그아웃할 때 사용자를 자동으로 로그아웃하려면 어떻게 해야 합니까?

다른 많은 페이지들 중에서 세션을 체크하기 위한 코드를 포함하는 로그인 페이지를 만들었습니다.사용자에게 세션이 없는 경우 모든 페이지가 새로고침되고 로그아웃 페이지로 리디렉션됩니다.이 스크립트는 3초마다 호출됩니다.

작성한 코드는 정상적으로 동작하고 있습니다만, 다른 방법으로 실장하고 싶습니다.사용자가 로그아웃하면 열려 있는 모든 탭이 새로고침/새로고침되어 사용자가 로그아웃됩니다.그게 가능한가요?

세션 체크php:

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

이 코드는 모든 페이지 바닥글에 있습니다.

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

ajax가 유용한 경우

3초마다 서버에 Ajax 요청을 하는 것은 경우에 따라 유용합니다. 다른 브라우저 2. 또는 많은 컴퓨터에서 탭을 연 경우 3. 또는 매우 오래된 브라우저를 사용합니다.

쿠키 설정이 작동하지 않습니다.

한 탭이 다른 탭의 변경된 쿠키를 인식하지 못하기 때문에 쿠키 설정을 사용하는 방법은 작동하지 않습니다.그 이유는document(getCookie에서 쿠키를 가져온 곳) 탭 A는 서버에 요청하지 않으면 변경되지 않습니다.SO의 두 탭을 열고 다음을 설정할 수 있습니다.setCookie('name', 'val', 1)하나의 탭으로 보고document.cookie다른 탭으로 이동합니다.

다른 탭에 로그아웃을 즉시 알리는 방법

동일한 브라우저의 모든 탭을 로그아웃해야 하는 경우 탭 간에 신호를 전달하는 것이 좋습니다.몇 가지 방법이 있는데, 이 방법을 알려드리고 싶습니다.localStorage(여기에 표시).

청취자를 에 접속할 수 있습니다.storage이벤트(스토리지 항목이 변경될 때 발생) 및 전송logout-event신호.

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

다른 탭은 모두 청취자에게 전달됩니다.

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

이전 브라우저가 이 기능을 탑재하지 않은 경우localStorage

두 가지 방법을 모두 사용할 수 있습니다.localStorage다른 컴퓨터에서 탭을 열었을 때 기능하는지 확인하기 위해 60초마다 자동 업데이트를 수행합니다.한다면localStorage동작하지 않는다(매우 오래된 브라우저), 3초마다 자동 갱신된다.

다음 바이올린은 대처법을 보여줍니다.

물론이지.

node.displus + socket.io 를 사용하여 사용자의 모든 브라우저 간에 신호를 전송할 수 있습니다.이것은 빠르게 동작하며 모든 기기에서 사용자를 로그아웃시키지만 일반적인 jQuery보다 처리하기가 조금 어렵습니다.

php 세션을 사용하고 있으며 페이지를 로드할 때마다 또는 일정 시간 후에 다음 코드를 체크하고 있는 것을 생각해 봅시다.

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

로그아웃 시.php 파일은 아마 이와 같은 설정되지 않은 작업을 하고 있을 것입니다($_SESS).ION['username']; 및 session_destroy();

따라서 당신의 페이지가 체크 php를 호출할 때 당신은 그 답례로 false를 발견하게 될 것이고, 그 다음 사용자는 더 이상 어떤 브라우저나 어떤 페이지에서도 접근할 수 없게 될 것입니다.자동 로그아웃의 경우는, 이것을 사용해 주세요.

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

주의: 설정해야 합니다.$inactive = 6000;를 들어)(「」 「」)을 사용합니다.

여기에는 두 가지 선택지가 있습니다.세션 값을 서버에 저장하고 Ajax 요청을 자주 수행하여 사용자가 아직 로그인 중인지 확인합니다.그러나 이로 인해 서버의 부하가 커지고 사용자의 네트워크 대역폭도 소비됩니다.그렇지 않으면

로그인한 쿠키가 아직 존재하는지 브라우저에 없는지 자주 확인합니다. 이것이 좋은 접근법이 될 것이다.

다 하다, 하다, 하다, 하다, 하다, 하다, 이렇게 할 수 요.setTimeout ★★★★★★★★★★★★★★★★★」setInterval

하지만 두 번째 것도 괜찮을 거야.

여기 당신이 필요한 것이 있습니다.여기 스니펫에는 원인을 알없는 오류가 있습니다. 따라서 자바스크립트 코드를 브라우저 콘솔(f12)에 복사하여 확인하시기 바랍니다. 동작합니다.사용자가 로그인 할 때

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

여기서 logged라는 쿠키를 설정합니다.

 
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);">
  

Ajax는 자주 서버에 사용자가 아직 로그인하고 있는지 여부를 확인합니다.그러나 이로 인해 서버의 부하가 커지고 사용자의 네트워크 대역폭도 소비됩니다.

서버에 대한 로드는 이 옵션을 비활성화합니다.시험해 봤어요.

언급URL : https://stackoverflow.com/questions/42111784/how-can-i-logout-a-user-from-all-open-tabs-automatically-when-user-logs-out-in-o

반응형