您需要在第二个请求中重新初始化会话才能使用它:如果没有这个初始化,Perl 将无法“猜测”您所说的$session
. 引用文档:
当用户单击另一个链接或在片刻后重新访问该站点时,我们是否应该再次创建新会话?绝对不。这将破坏状态维护的整个目的。由于我们已经将 id 作为 cookie 发送,我们只需要在创建会话对象时将该 id 作为 seconds 参数传递:
$sid = $cgi->cookie("CGISESSID") || undef;
$session = new CGI::Session(undef, $sid, {Directory=>'/tmp'});
上面的语法将首先尝试初始化现有的会话数据,如果失败(如果会话不存在)创建一个新会话:正是我们想要的。但是如果用户不支持 cookie 怎么办?在这种情况下,我们需要将会话 ID 作为查询字符串附加到所有 url,并在 cookie 之外查找它们:
$sid = $cgi->cookie('CGISESSID') || $cgi->param('CGISESSID') || undef;
$session = new CGI::Session(undef, $sid, {Directory=>'/tmp'});
假设您手边有 CGI 对象,您可以将上述两行最小化为一行:
$session = new CGI::Session(undef, $cgi, {Directory=>"/tmp"});