访问者关闭或离开页面时是否可以创建自动注销?我知道我使用的代码不是很好,但是我需要一些没有数据库的东西。无论如何,我使用2个文件,一个login.php和index.php。我才刚刚开始写PHP,所以一个“简单”的解释将非常有用;)
我现在使用的登录代码:
login.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');
?>
答案 0 :(得分:1)
没有“直接”方法。
第一次尝试可能是减少时间,在php配置中会话仍然存在。
您想要的东西可以用JavaScript制作,因此在离开页面时可能发生注销,但是您不能依靠它,如果我杀死我的浏览器或浏览器崩溃,则不会进行注销请求您的服务器!
问题的目的是什么?您唯一可以依靠的事实是,如果在给定的时间内不使用会话,会话将被自动破坏
答案 1 :(得分:0)
您可以保存用户的上次活动,然后说出该用户是否处于非活动状态超过1-2-3-4-5分钟。然后用户处于脱机状态。 但是,如果您要进行在线用户列表之类的操作,则应将上次活动保存在数据库中。
示例:
<?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()
}
?>
答案 2 :(得分:0)
因此,我尚未对此进行测试,但它可能有效。不过,您将需要使用一些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();
});