1

我目前处理 PHP Web 应用程序的超时,如下所示:

  • 当前,每个页面在 PHP 中都有一个超时检查,它检查当前时间与用户最后一次加载页面的情况。如果两者之差超过 15 分钟,则销毁用户会话,创建新会话,将当前页面位置放到会话上,并将用户重定向到登录页面。
  • 每个页面头都有一个<meta>标签,在 15 分 5 秒后刷新页面(因此“调用”超时检查)

我现在正在考虑为用户添加更大的控制权,例如,如果他们碰巧在页面上工作了很长时间,并且正在考虑允许在超时前大约两分钟出现弹出窗口。然后弹出窗口将具有继续会话(进行 AJAX 调用以刷新会话中的最后一个活动)或注销的选项。如果弹出窗口被忽略(例如,如果用户在不同的页面上),则用户将被注销。

根据Using Javascript to override or disable meta refresh tag,我将无法重置<meta>标签,这可能意味着我必须删除标签。PHP/Javascript Session Timeout with warning的唯一答案建议使用 JavaScript 调用重定向到登录页面,但是这可以通过禁用 JavaScript 来规避。

我正在考虑<meta>用(允许,因为我使用 HTML5)包围重定向标签<noscript>,这样即使用户不使用 JavaScript,它们仍然会超时。这也将删除<meta>触发用户是否决定继续他们的会话的标签。

这种方法有意义吗?我错过了什么吗?还有另一种更有意义的方法吗?


我当前的代码

<?php
require_once("include/session.php");
require_once("include/sessioncheck.php");
?>
<html>
    <head>
         <meta http-equiv="refresh" content="<?= TIMEOUT_MIN * 60 ?>" />
         <!-- additional tags -->
    </head>
    <body>
        <!-- content -->
    </body>
</html>
4

1 回答 1

4

我最终做的是留下我的 sessioncheck.php 代码并删除<meta>标签。然后我在结束正文标记之前添加了以下内容:

<div id="timeout-warning"></div>
<div id="timeout-warning-text">Your session is set to expire in less than one minute
    due to inactivity. Click <a href="javascript:void(0)" id="timeout-restart">
    here</a> to keep your session alive.</div>

<script type="text/javascript">
    var timeoutWarning;
    var timeout;
    $(document).ready(function() {
        $("#timeout-restart").click(function() {
            clearTimeout(timeout);
            timeout = setTimeout(function() {
                document.location.reload(false);
            }, 1801000);
            timeoutWarning = setTimeout(function() {
                $("#timeout-warning").fadeTo(2000, 0.5);
                $("#timeout-warning-text").fadeIn(2000);
            }, 1740000);
            $("#timeout-warning").hide();
            $("#timeout-warning-text").hide();
            return false;
        });

        timeoutWarning = setTimeout(function() {
            $("#timeout-warning").fadeTo(2000, 0.5);
            $("#timeout-warning-text").fadeIn(2000);
            clearTimeout(softTimeout);
        }, 1740000);
        timeout = setTimeout(function() {
            document.location.reload(false);
        }, 1801000);
    });
    </script>

1740000 和 1801000 数字基于 PHP const,恰好基于半小时的超时。

于 2013-03-08T17:36:01.923 回答