2010-06-04 49 views
3

我在RIA工作。我们使用memcached来存储会话,我已经安装了http://pecl.php.net/package/memcache和我的PHP会话处理程序是这样的:通过ID检查会话是否存在,而不更新会话的生存期

$session_save_path = "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10, ,tcp://$host:$port "; 
ini_set('session.save_handler', 'memcache'); 
ini_set('session.save_path', $session_save_path); 

会话超时设置为30分钟。在我的RIA中,我想通过AJAX定期调用服务器端脚本来检查访问者的会话是否仍然存在。如果ajax调用返回false,我会中断屏幕并显示一个漂亮的重新日志以继续会话。

现在问题是与服务器端脚本。我需要确定会话是否存在,而不会延长会话的生存期(如果存在的话)。

我不能完全knowladble关于会话处理程序的工作方式,但我敢肯定,如果我这样做:

<? 
session_start(); 
if($_SESSION['loggedin'] == "yes") 
    echo "true"; 
else 
    echo "false"; 
?> 

我敢肯定,这将更新会话的寿命(上服务器端,而且在客户端通过发送一个新的cookie返回给客户端)。会议将存在不定期。

有些选项我考虑过,但不包括:

  • 不要做任何服务器端调用,但在客户机上使用JavaScript的定时器(30分钟例如后到期)。当用户在多个窗口中打开RIA时,这不起作用
  • 尝试绕过session_start()以防止它将新的新cookie发送回客户端。这可能适用于客户端,但过期时间仍会在内部session_handling中刷新。

我想要一些想法,T.i.a.

回答

0

不要用Javascript单独验证用户。你只是要求一些严重的安全问题。

您的第一种使用Ajax进行$ _SESSION ['loggedin']检查的方法将有效 - 如果它们的前一个会话已过期,它将在继续之前生成一个新的会话ID,因此$ _SESSION ['loggedin']将不会组。

+0

这不是验证,我验证每个用户页面重新加载到服务器端。我只是为了方便用户。 第一种方法是,如果我的用户在14:00登录,并且什么也不做,他的sesison将在14:30到期,但后台的JavaScript每5分钟通过AJAX调用脚本,不会在他的会话时间每次通话都要更新一次(例如14:35,14:40,14:45,14:50)。意味着他的会话将不会超时。这就是问题所在,session_start会导致会话的生存期延长。 – Kwaak 2010-06-04 12:59:57

1

您不必将会话超时等同于授权超时。我建议在会话中存储一个额外的变量,即用户登录时的时间戳。然后,如果会话不存在或时间戳太旧,则可以认为用户已注销。作为一个副作用,它也会给你额外的精度,因为会话不能保证在你设置完成时过期,但可能会持续一段时间直到垃圾收集运行。

由于事实上我建议你在一个简单的类包装此功能,做这样的事情:

$acl->logIn($username); //set the user as logged in 
$acl->isLoggedIn($username); //Is he still logged in? 

等,等

+0

是的,那就意味着将一个全新的超时变量引入到我的会话管理和身份验证管理中。如果可能的话,我宁愿避免。 – Kwaak 2010-06-04 13:09:10

+0

@Kwaak - 除非你一直在遍地拷贝粘贴授权代码,否则最简约的版本可以用2-3行代码实现。我不知道你是否能找到一个需要较少工作来实施的解决方案。 – 2010-06-04 13:40:46