【问题标题】:Logging out after certain amount of time一定时间后退出
【发布时间】:2009-08-11 06:44:52
【问题描述】:

在 X 秒不活动后从 PHP 应用程序中注销用户(基本上只是执行重定向)的最佳方法是什么?对于“不活动”,我会计算最后一次页面加载的时间,如果当前时间超过 X 秒,则执行重定向。

这是需要用 Javascript 来实现的吗?

【问题讨论】:

    标签: php javascript


    【解决方案1】:

    您可以只使用 html 元标记:
    <meta http-equiv="refresh" content="1000;url=buy.aspx">
    放在头上
    其中 1000 是以秒为单位的时间,而 url 是要重定向的 url。

    【讨论】:

    • +1 使用 meta,可以在 JS 中完成,但如果你能坚持纯 HTML,那就更好了!
    【解决方案2】:

    昨天刚刚回答this question... OP 想在一定时间后询问用户是否想保持登录状态。

    对于没有任何确认的普通重定向,您可以使用简单的 setTimeout 调用:

    var minutes = 30;
    setTimeout(function(){location.href = 'logout.php';}, minutes*60*1000); 
    

    【讨论】:

    • 棘手的部分是不活动。让某人超时很容易......在他们坐着阅读页面时不让他们超时更难,并且需要跟踪点击模式、鼠标移动等内容。
    【解决方案3】:

    您真的出于某种原因想要重定向吗?

    通常每个用户会话都有一个关联的时间戳。然后确保用户的会话没有过期,或者要求他们登录。因此,实际上,您只是确保会话有效。

    如果您将某人重定向到注销页面,那么您确实没有取得任何成果。您还需要确保会话没有超时服务器端。客户端的任何事情,包括重定向到注销页面,都是不可靠的,并且可以被规避。

    PHP中最简单的形式:

    <?php 
    
    session_start();
    
    $session_lifetime = 60*60; // 1 hour
    
    if (!isset($_SESSION['time']) || !$_SESSION['time']) {
    $_SESSION['time'] = time();
    }
    
    if (time() - $_SESSION['time'] > $session_lifetime) {
    // session has expired
    $_SESSION['user'] = null;
    $_SESSION['time'] = null;
    } else {
    // keep session alive
    $_SESSION['time'] = time();
    }
    

    【讨论】:

      【解决方案4】:

      如果用户开始在页面上输入表单并且在您的超时期限之前还没有完成怎么办?到目前为止,我以不同于其他答案中描述的方式处理不活动。

      var rowLockSeconds = 0;
      
      function startRowLockTimer()
      {
         setInterval("incrementRowLockTimer()",60000);
         $("input").keypress(function (e) { rowLockSeconds=0; }).click( function() { rowLockSeconds=0;  });
         $("textarea").keypress(function (e) { rowLockSeconds=0; }).click( function() { rowLockSeconds=0; ; });
      
         window.onbeforeunload = function obul() { if (hasChanged) { return 'You will lose any unsaved changes you\'ve made.'; } }
         window.onunload = clearRowLock;
      }
      

      所以当他们登录后,行锁计时器从 0 开始。每 60 秒它调用一次间隔函数来查看是否超时。

      function incrementRowLockTimer()
      {
      rowLockSeconds = rowLockSeconds+60;
      
      // 10 minute timer to clear someone out of a page if there has been no activity
      if (rowLockSeconds >= 600)
      {
          window.onbeforeunload=null;
          // clear rowLock with request here
          $.get('../ajax/rowLock-server.php?do=delete&rowLockID='+currentRowLockID+'&userUUID='+currentUserUUID, function() { 
              alert('You have been logged out of this page after 10 minutes of inactivity.');
              document.location.href='../main.php';
          });
      }
      }
      

      AJAX 控件清除 DB 行锁。

      关键是 input 和 textarea 绑定,这样如果用户在表单中输入任何内容,超时就会重置,他们还有 10 分钟的时间。

      【讨论】:

        猜你喜欢
        • 2017-05-27
        • 1970-01-01
        • 2017-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        • 2013-11-12
        相关资源
        最近更新 更多