【问题标题】:get session id after the session has timedout会话超时后获取会话 ID
【发布时间】:2013-11-01 04:14:11
【问题描述】:

我经营一个网站,人们可以通过不同的门户登录,这些门户并不总是在我的域中。

当有人注销时,他们会被重定向到他们的原始门户网址。

我将 php 会话超时设置为半小时,但是我遇到了一个问题,即我的一些用户在超时期间处于休眠状态。因此,当他们回到他们正在做的事情时在我的网站上,然后重新加载他们不可避免地会转到我的主页的页面。

我收到了一些关于此的投诉。

作为一种可能的解决方法,我在考虑:

1 - 针对用户将会话 ID 存储在数据库中。

2 - 当用户通过超时运行检查时,获取会话 ID 通过以查找用户然后重定向到那里的原始门户 页面。

这是一个好的逻辑吗?我认为我对会话 ID 的了解不够。超时后会话在浏览器中被终止,还是我仍然可以在服务器端获取它?

谢谢, 约翰

【问题讨论】:

    标签: php session session-timeout


    【解决方案1】:

    我认为存储 session_id 是没用的,因为它在超时后将无效。一旦会话到期,就是这样。一旦你调用session_start(),就会发生垃圾回收。

    一些选项:

    • 如果在 30 分钟内没有任何活动,则警告用户,出于“安全”目的,当前会话将被清除,然后忘记投诉,因为它成为用户的责任。
    • cron 工作,如果您不介意您的服务器做一些额外的工作,根据$_SESSION 数据大小、会话数和运行频率,这很容易搞砸。
    • 带有setInterval() 的JS 进行刷新(或重定向,如果需要)。
    • 元刷新(如果需要,使用重定向)。
    • 为站点的每个用户|部分设置不同的会话超时值。这是一个post,它解释了如何,但我从未尝试过。

    【讨论】:

    • 嗨 gwillie,是的,我已经警告过用户。我不想以任何方式(通过 js、个人用户)扩展会话。你说一旦会话过期就是这样,但是浏览器是否仍然发送会话 ID,如果是这样,是否绝对没有办法获取它?我不想更新他们的会话只是简单地重定向到不同的 url..?
    【解决方案2】:

    每次调用 session_start 时会话文件时间戳(如果存在)都会更新,用于计算 session.gc_maxlifetime 是否已超过。

    更重要的是,您不能依赖会话在 session.gc_maxlifetime 时间超过后过期。

    PHP 在当前会话加载后对过期会话运行垃圾收集,并通过使用 session.gc_probability 和 session.gc_divisor 计算垃圾收集运行的概率。默认情况下,它的概率为 1%。

    如果您的访问者数量较少,则非活动用户可能会访问本应过期并被删除的会话。如果这对您很重要,您将需要在会话中存储时间戳并计算用户处于非活动状态的日志。

    此示例替换 session_start 并强制超时:

    function my_session_start($timeout = 1440) {
        ini_set('session.gc_maxlifetime', $timeout);//change the session timeout
        session_start();
    
        if (isset($_SESSION['timeout_idle']) && $_SESSION['timeout_idle'] < time()) {
            session_destroy();
            session_start();
            session_regenerate_id();
            $_SESSION = array();
        }
    
        $_SESSION['timeout_idle'] = time() + $timeout;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-22
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 2014-07-24
      相关资源
      最近更新 更多