当用户注销 php 中打开的选项卡之一时,自动注销所有打开的选项卡

Posted

技术标签:

【中文标题】当用户注销 php 中打开的选项卡之一时,自动注销所有打开的选项卡【英文标题】:Logout all open tabs automatically when user logs out in one of the opened tabs in php 【发布时间】:2016-02-14 20:43:42 【问题描述】:

我正在研究 php 中的 php 会话概念。使用 jquery 和 php 创建登录页面,并在我登录会话运行时为所有页面创建会话我可以在另一个选项卡中打开登录的 url,效果很好,但我在注销时遇到问题。

当我在打开的浏览器选项卡之一中注销时,如果我刷新页面被注销,其他选项卡仍会手动运行。我的要求是当我在其中一个选项卡中注销时,其他选项卡应自动注销而不是手动注销。

数据库文件

<?php
    session_start();
    $con = mysqli_connect("localhost", "root", "","testing") or die ("Oops! Server not connected"); // Connect to the host

?>

Login.php

   <?php
    include 'db.php';
    if(isset($_SESSION['username']) && $_SESSION['username'] != '')
     // Redirect to secured user page if user logged in

        echo '<script type="text/javascript">window.location = "userpage.php"; </script>';
    
?>
<html>

    <body>
        <form>
            <table class="mytable">
                <tr>
                    <td>Username</td>
                    <td>
                        <input type="text" name="username" id="username" class="as_input" value="s"/>
                    </td>
                </tr>
                <tr>
                    <td>Password</td>
                    <td>
                        <input type="password" name="password" id="password" class="as_input" value="s"/>
                    </td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td colspan="2">
                        <input type="submit" name="login" id="login" class="as_button" value="Login &raquo;" />
                    </td>
                </tr>
            </table>
        </form>

    </body>
</html>

欢迎主页

<?php
    include 'db.php';
    if(!isset($_SESSION['username']) || $_SESSION['username'] == '')
    
        echo '<script type="text/javascript">window.location = "login.php"; </script>';
    
?>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>

    <body>

        <div class="as_wrapper">

            <h2>
                welcome to home page
            </h2>
            <a href="logout.php" class="a">logout</a><br><br>
            <a href='#'>test link</a>
        </div>

    </body>
</html>

logout.php

<?php
    include 'library.php';
    session_destroy();
    unset($_SESSION['username']);
    unset($_SESSION['password']);
    echo '<script type="text/javascript">window.location = "login.php"; </script>';

?>

【问题讨论】:

***.com/questions/13513874/… Logout all open tabs automatically when user logs out in one of them的可能重复 【参考方案1】:

创建一个php页面:

checkStatus.php

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

    else 
        echo false;
?>

现在每个页面都有这个 jQuery 代码:

var _delay = 3000;
function checkLoginStatus()
     $.get("checkStatus.php", function(data)
        if(!data) 
            window.location = "logout.php"; 
        
        setTimeout(function()  checkLoginStatus(); , _delay); 
        );

checkLoginStatus();

所以每个页面在经过一定的延迟后都会重复调用一个 js 函数,该函数将通过对 php 文件(您已创建)进行 ajax 调用来检查登录状态。如果用户从任何注销,它将破坏浏览器中的会话并使所有选项卡重定向到 logout.php 页面。

【讨论】:

很高兴它有帮助,如果它解决了您的问题,请考虑投票并将其标记为正确答案。【参考方案2】:

您需要有一个 javascript 侦听器来检查会话是否已被销毁;

window.setInterval(function()
  /// call your function here to cechk the server
, 5000);

【讨论】:

【参考方案3】:

您可以使用ajax 检查用户的会话是否仍然设置。 包含ajax后,您应该调用bellow js函数

var targetURL="login.php";

  function auto_check_login()
    $.ajax(
      url: "check_user_session.php",
      cache: false,
      success: function(data)
          if(data != 1)
              window.location=targetURL; //Redirect user to login page.
          
       
    );
  

  $(document).ready(function()

    auto_check_login(); //Call auto_check_login function when DOM is Ready

  );

  //Call auto_check_login after 2 seconds
  setInterval(auto_check_login,2000);

然后在check_user_session.php文件中,你可以有这个

session_start();

if( !isset($_SESSION['username']) || !isset($_SESSION['password']) )
print 0;
 else 
print 1;

【讨论】:

【参考方案4】:

您必须检查 $_SESSION['username'] 是否设置了一次,而是设置了多次。 检查此索引是否存在,如果不存在,则将用户重定向到登录页面。

【讨论】:

以上是关于当用户注销 php 中打开的选项卡之一时,自动注销所有打开的选项卡的主要内容,如果未能解决你的问题,请参考以下文章

当用户注销其中一个标签时,如何自动从所有打开的标签中注销用户?

打开多个选项卡的自动注销

注销 mvc 中打开的页面

自动检测浏览器选项卡中的注销?

从选项卡注销,不适用于所有其他选项卡

phpmyadmin 自动注销时间