1

現在、PHP Web アプリケーションからのタイムアウトを次のように処理しています。

  • 現在、各ページには PHP のタイムアウト チェックがあり、ユーザーが最後にロードしたページに対して現在の時刻をチェックします。両者の差が 15 分を超えると、ユーザーのセッションが破棄され、新しいセッションが作成され、現在のページの場所がセッションに配置され、ユーザーはログイン ページにリダイレクトされます。
  • 各ページ ヘッドには、<meta>15 分 5 秒後にページを更新するタグがあります (したがって、タイムアウト チェックを「呼び出します」)。

現在、ユーザーがページで長時間作業している場合など、ユーザーの制御を強化することを検討しており、タイムアウトの約 2 分前にポップアップを表示できるようにすることを検討しています。ポップアップには、セッションを続行する (セッションの最後のアクティビティを更新するために AJAX 呼び出しを行う) か、ログアウトするオプションがあります。ポップアップが無視された場合 (たとえば、ユーザーが別のページにいる場合)、ユーザーはログアウトされます。

Using Javascript to override or disable meta refresh tagによると、タグをリセットすることはできません<meta>。つまり、タグを削除する必要がある可能性があります。PHP/Javascript Session Timeout with warningの唯一の回答は、ログイン ページへの JavaScript 呼び出しリダイレクトを使用することを提案していますが、これは JavaScript を無効にすることで回避できます。

私が考えているのは、ユーザーが JavaScript を使用していなくてもタイムアウトになるように、(HTML5 を使用しているので許容できる)<meta>リダイレクト タグを囲むことです。<noscript>これにより<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>タグを削除することでした。次に、 body 終了タグの前に次を追加しました。

<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 に基づいており、たまたま 30 分のタイムアウトに基づいています。

于 2013-03-08T17:36:01.923 に答える