3

我在 RIA 工作。我们使用 Memcached 来存储会话,我已经安装了http://pecl.php.net/package/memcache,我的 PHP 会话处理程序如下所示:

$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,我会关闭屏幕并显示一个漂亮的 relogbox 以继续会话。

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

我对会话处理程序的工作方式并不完全了解,但我很确定我是否会这样做:

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

我很确定这会更新会话的生命周期(在服务器端,但也在客户端通过将新的 cookie 发送回客户端)。并且会话将无限存在。

我考虑过的一些选项,但被排除在外:

  • 不要进行任何服务器端调用,而是在客户端上使用 javascript 计时器(例如 30 分钟后到期)。当用户在多个窗口中打开 RIA 时,这将不起作用
  • 尝试破解 session_start() 以防止它向客户端发送新的新鲜 cookie。这可能适用于客户端,但到期时间仍将在内部 session_handling 处刷新。

我想要一些想法,蒂亚

4

2 回答 2

1

您不必将会话超时与授权超时等同起来。我建议在会话中存储一个额外的变量,即用户登录时的时间戳。然后,如果会话不存在或时间戳太旧,您可以认为用户已注销。作为副作用,它还会为您提供额外的精度,因为不能保证会话在您设置它时完全过期,但可能会在垃圾收集运行之前逗留一段时间。

事实上,我建议您将此功能包装在一个简单的类中并执行以下操作:

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

等等等等

于 2010-06-04T12:56:16.870 回答
0

不要仅使用 Javascript 验证您的用户。您只是在询问一些严重的安全问题。

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

于 2010-06-04T12:52:58.973 回答