我正在尝试注销非活动用户。如果他们在 30 分钟内没有移动鼠标或键入,则他们会自动注销并返回登录屏幕。登录详细信息存储在我的数据库中。
登录例程
<?php
require_once('includes/session.php');
if (isset($_GET['logout']) and $_GET['logout'] == 1){
logout();
}
//doublecheck status
if (isset($_SESSION['user_id'])){
$login = 1; $login_message = "Logged In";
}else{
$login = 0; $login_message = "Logged Out";
}
include_once("../includes/masterinclude.php");
//include_once("../includes/functions_admin.php");
$preferences = getPreferences();
$ip=$_SERVER['REMOTE_ADDR'];
$message_login = "";
if (isset($_POST['username']) and isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'];
$hashed_password = sha1($password);
$u = Confirm_User($username, $hashed_password);
if ($u == 1){
$u = Get_User($username, $hashed_password);
$_SESSION['user_id'] = $u->user_id;
$_SESSION['username'] = $u->user_name;
echo "<script type='"text/javascript'">document.location.href='"/home'";</script>";
}else{
$warning = "red";
$message_login = "Login failed - Please try again";
}
}
?><head>
<form id="login" name="login" class="form-horizontal" method="post" action="_cms/login.php" _cms/style="display: block;">
<div class="form-group" id="reauthorizeInner">
<?php
if($message_login != ""){
echo "<p><span class='"message-error'">" . $message_login . "</span></p>";
}else{
echo "<p class='"message'">Please enter your username & password</p>";
}
?>
<div class="input-group col-xs-12">
<input id="reauthuser" class="form-control" type="text" placeholder="Username.." name="username" value="username" onFocus="this.value=''" required="yes" message="You must enter a username">
<span class="input-group-addon">
<i class="icon-envelope-alt icon-fixed-width"></i>
</span>
</div>
</div>
<div class="form-group" id="reauthorizeInner">
<div class="input-group col-xs-12">
<input id="reauthPassword" class="form-control" name="password" type="password" value="password" onFocus="this.value=''" required="yes" message="You must enter a password">
<span class="input-group-addon">
<i class="icon-asterisk icon-fixed-width"></i>
</span>
</div>
</div>
<div class="clearfix">
<div class="btn-group btn-group-sm pull-right">
<button class="btn btn-primary" id="submit" type="submit" onclick="document['login'].submit();">
<i class="icon-arrow-right"></i>
Login
</button>
</div>
<div class="make-switch pull-left" data-on="primary" data-off="danger"></div>
</div>
</form>
会话.php
<?php
session_start();
if (isset($_SESSION['user_id'])){
$login = 1;
}else{
$login = 0;
}
function confirm_logged_in() {
if (!isset($_SESSION['user_id'])) {
//redirect
header("Location: /_cms/login.php?login=0");
}
}
function logout(){
$_SESSION = array();
if(isset($_COOKIE[session_name()])){
setcookie(session_name(), '', time()-42000, '/');
}
session_destroy();
}
?>
我知道这里有很多代码,但我必须包含它,否则人们不会看到为此创建注销计时器的复杂性。我尝试了几种不同的方法,但由于登录例程错误的方式,它们都不起作用。任何帮助将不胜感激!
我会使用一些JS/jQuery和iddletimout库,并将其与您的PHP代码相结合:
$.idleTimeout('#idletimeout', '#idletimeout a', {
idleAfter: 300, //seconds
onTimeout: function() {
//some code
window.location = "logout.php"; //This is your PHP logout page
},
onIdle: function() {
//some code
},
onCountdown: function(counter) {
//some code
},
onResume: function() {
//some code
}
});
你需要一些JavaScript代码,如果发生某些事件,它会计算时间并重置计数器。但是,如果计数器达到 30 分钟,则必须执行 AJAX 调用,这将注销该用户 - 调用您的注销函数。
当然,你可以使用 PHP 的内置会话超时,默认情况下,它会在 30 分钟没有活动后杀死会话。
如果您希望它在用户移动鼠标时保持活动状态(而不是主动发出http请求),那么您可以在Javascript中有一些代码,通过鼠标移动每隔一段时间发送一次ajax"ping"事件。ajax ping 甚至不需要做任何事情,只要它运行一个引用会话的虚拟 PHP 脚本,它就足以保持会话打开。如果在 30 分钟内未调用 ping 脚本,则会话将超时。
因此,实际上没有必要专门调用注销;只需让会话过期即可。
(无论如何,您都需要发生这种情况,以处理用户关闭浏览器,或崩溃,或失去网络连接等情况;在这些情况下,您不希望会话永远悬而未决)