Javascript 如何在30分钟后注销活动用户?

Javascript 如何在30分钟后注销活动用户?,javascript,php,Javascript,Php,我正在尝试注销非活动用户。如果他们在30分钟内没有移动鼠标或键入内容,则会自动注销并返回登录屏幕。登录详细信息存储在我的数据库中 登录例程 <?php require_once('includes/session.php'); if (isset($_GET['logout']) and $_GET['logout'] == 1){ logout(); } //doublecheck status if (isset($_SESSION['u

我正在尝试注销非活动用户。如果他们在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 &amp; 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>

登录
Session.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,并将其与您的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脚本,就足以保持会话打开。如果ping脚本在30分钟内未被调用,则会话将超时

因此,没有必要特别要求注销;让会话过期


(无论如何,您都需要这样做,以处理用户关闭浏览器、浏览器崩溃或网络连接中断等情况;在这些情况下,您不希望会话永远挂起)

为什么?请解释一下,我没把它变成负片!我也没有。有些用户是憎恨者。好吧,如果我插手我的php。我的登入和登出功能会在哪里?对不起,我对JS很糟糕。你能解释一下onTimeout、onIdle、onCountdown和onResume的功能吗?谢谢:)一个简单的方法是创建一个专门用于注销的php页面。此页面将终止会话并将用户重定向到主页。然后在JS中,您将在超时时将用户重定向到注销页面:
onTimeout:function(){window.location=“logout.php”;}
为了更好地理解Iddletimeout函数,您需要查看我为文档提供的链接。要么就是这样,要么自己编JS,但为什么要重新发明轮子呢?好的,我现在读一读,非常感谢你的帮助!我以前从未这样做过,但我是否下载这些文件并将它们放在我的服务器上或..?“在30分钟无活动后终止会话”-否会话在会话后有资格进行垃圾收集。gc_maxlifetime秒,无请求-默认会话处理程序将愉快地继续为早于此的会话提供服务,直到它们被删除。通常,登录和退出系统被视为安全措施-但无法在客户端强制执行安全措施一边如果要确保会话被终止,则需要自定义会话处理程序。