【问题标题】:Automatically logout when leaving the page (PHP)离开页面时自动注销(PHP)
【发布时间】:2019-05-12 09:59:31
【问题描述】:

是否可以在访问者关闭或离开页面时创建自动注销?我知道我使用的代码不是很好,但我需要一些没有数据库的东西。无论如何,我使用 2 个文件,一个 login.php 和 index.php。我才刚开始写 PHP,所以一个“简单”的解释会非常受欢迎;)

我现在使用的登录代码:

登录.php

<?php defined('DS') OR die('No direct access allowed.');

$users = array(
    "admin" => "admin"
);

if(isset($_GET['logout'])) {
    $_SESSION['username'] = '';
    header('Location:  ' . $_SERVER['PHP_SELF']);
}

if(isset($_POST['username'])) {
    if($users[$_POST['username']] !== NULL && $users[$_POST['username']] == $_POST['password']) {
        $_SESSION['username'] = $_POST['username'];
        header('Location:  ' . $_SERVER['PHP_SELF']);
    }else {
        //invalid login
        echo "<p>Username and/or password is incorrect!</p>";
    }
}

echo '<form method="post" action="'.SELF.'">
  <h2>Login</h2>
  <p><label for="username">Username</label> <input type="text" id="username" name="username" value="" /></p>
  <p><label for="password">Password</label> <input type="password" id="password" name="password" value="" /></p>
  <p><input type="submit" name="submit" value="Login" class="button"/></p>
  </form>';
exit;
?>

index.php

<?php
session_start();

define('DS',  TRUE);
define('USERNAME', $_SESSION['username']);
define('SELF',  $_SERVER['PHP_SELF'] );

if (!USERNAME or isset($_GET['logout']))
    include('login.php');
?>

【问题讨论】:

  • @MasivuyeCokile 如果我理解正确,该解决方案会在特定时间后销毁会话,我实际上希望在您离开页面时销毁会话,无论如何谢谢
  • 我在你给我们看的 forst 脚本中没有看到session_start() !!!
  • 正确,它在第二个文件中。那是问题吗? @RiggsFolly
  • 是的,必须在所有想要使用会话的脚本中,并且在脚本的顶部

标签: php session login logout


【解决方案1】:

没有“直接”的方法。

第一次尝试可能是降低时间,一个会话在你的 php-configuration 中是活动的。

你想要的东西可以用 JavaScript 制作,所以当离开页面时可能会发生注销,但你不能依赖它,如果我杀死我的浏览器或浏览器崩溃,将不会发出注销请求你的服务器!

您的问题的目的是什么?您可以依赖的唯一事实是,如果在给定的时间内未使用会话,会话将自动销毁

【讨论】:

    【解决方案2】:

    您可以保存用户的上次活动,然后说明用户是否已超过 1-2-3-4-5 分钟不活动。然后用户离线。 但是,如果您想制作在线用户列表之类的内容,则应将 last-activity 保存在数据库中。

    例子:

    <?php
    $user_time = 'last-activity';
    $current_time = time();
    $logout_after = 5*60;
    
    if(($user_time+$logout_after) < $current_time) {
        // set to offline
    } else {
        //check if user is set to online, if not set the status to offline and update last-activity: time()
    }
    ?>
    

    【讨论】:

      【解决方案3】:

      所以我没有对此进行测试,但它可能会起作用。不过你需要使用一些 JS/jQuery。

      使用 .unload() 函数来确定用户何时离开页面,然后向您取消设置会话的注销脚本发送请求

      $(window).unload(function() {
          var xmlhttp = new XMLHttpRequest();
          xmlhttp.onreadystatechange = function(){
              if(this.readyState == 4 && this.status == 200){
      
              }
          };
          xmlhttp.open("POST", "logoutScript.php", true);
          xmlhttp.send();
      });
      

      【讨论】:

        猜你喜欢
        • 2011-03-11
        • 1970-01-01
        • 2017-06-03
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 2014-05-25
        • 1970-01-01
        相关资源
        最近更新 更多