2013-10-31 60 views
0

我运行一个网站,人们可以通过不同的门户登录,这些门户并不总是在我的域上。会话超时后获取会话ID

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

我有php会话超时设置为半小时,但是我面临的问题是,我的一些用户在超时时间内在网站上休眠。因此,当他们回到他们是什么时候在我的网站上做,并重新加载他们不可避免地到我的主页上的页面。

我收到了一些有关这方面的投诉。

作为一种可能的解决办法,我在想:

1 - 存储对用户的数据库会话ID。

2 - 当用户通过超时运行检查时,抓住会话ID 传递给用户,然后重定向到那里原来的门户 页面。

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

感谢, 约翰

回答

0

存储SESSION_ID是没用的,我认为,因为它不会是超时后有效。会话过期后,就是这样。一旦你拨打session_start(),就会发生垃圾回收。

一些选项:

  • 提醒用户如果在30分钟内,则当前会话将被消灭的“安全”的宗旨没有活动,然后忘了抱怨,因为它变成了负责任的用户。
  • cron在工作,如果你不介意你的服务器做一些额外的工作,这可能很容易使它受到影响,这取决于数据大小,会话数量以及运行频率。
  • JS与setInterval()刷新(或根据需要重定向)。
  • 元刷新(如果需要重定向)。
  • 为网站的每个用户|部分设置不同的会话超时值。这是一个post,解释如何,但我从来没有尝试过。
+0

gwillie嗨,是我做的已经向用户发出警告。我不想以任何方式延长会议(通过js,个人用户)。你说,一旦会话过期了,那么浏览器是否仍然发送会话ID,如果是的话,是不是完全没有办法抓住它?我不想更新他们的会议只是重定向到一个不同的网址..? – John

0

每次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; 
}