当用户登录时,我在Perl CGI中创建了一个新会话,并将会话ID存储在cookie(CGISESSID)中。然后通过重定向将该cookie发送到下一页,如下所示:
my $session = CGI::Session->new("driver:File", undef, {Directory=>"/tmp"});
my $sid = $session->id();
$session->param("username", $username);
$session->expire('+15m');
print redirect ( -cookie => cookie(CGISESSID => $session->id), -uri => 'x.cgi');
On' x.cgi' (以及网站的所有其他页面)我有:
my $sid = cookie ('CGISESSID') || param('CGISESSID') || undef;
my $session = CGI::Session->load(undef, $sid, {Directory=>'/tmp'});
$session->expire('+15m');
my $username = $session->param("username");
if (!defined ($username)) {
print redirect ("login.cgi");
}
但是,在随机的时间/点击之后(远在15米标记之前,从第一次点击到2-3分钟之后的点击),它会重定向到login.cgi。
调试告诉我,虽然它重定向了我(并且没有定义$ username),但代码仍然获得了最初创建的正确会话ID(会话似乎仍然完好无损),并且cookie仍然存在。
我没有将CGISESSID作为参数传递给任何页面请求/链接(因为我认为cookie可以避免这样做)
任何想法可能导致$ username在一段随机时间后未定义?
答案 0 :(得分:1)
鉴于您的描述是正确的并且您的代码工作了一段时间,然后停止工作,我建议检查没有人正在清理您的/tmp
目录,特别是那里的会话文件。 / p>
当您使用带有CGI::Session
驱动程序的file
模块创建会话时,它只会在给定目录中创建一个文本文件(代码中为/tmp
)。这是一个包含一些Perl代码的文本文件,您可以cat
查看它内部的内容:
$ cat cgisess_126b3cd2c4b9ac6eaac0185afbc46d34 && echo
$D = {'_SESSION_ID' => '126b3cd2c4b9ac6eaac0185afbc46d34','_SESSION_ATIME' => 1413493418,'_SESSION_REMOTE_ADDR' => '','_SESSION_CTIME' => 1413493418};;$D
对于file
驱动程序,可以通过
my $filename = sprintf $CGI::Session::Driver::file::FileName, $session->id;
检查它是否已创建且存在至少15分钟。如果它消失了,则责怪一些cron作业,其他一些脚本或你的托管服务提供商。