Perl CGI 持久化 cookies

3
我希望即使浏览器关闭,用户也不需要重新登录。我的cookies设置为一个月后过期。
当用户成功登录时,请执行以下操作:
 $session = CGI::Session->new (undef, undef, {Directory=>'tmp/'})
                                      or die CGI::Session->errstr;
                $session->param('username', $username);
                $session->expire('+1M');                
                $cookie = $cgi->cookie( -name=>$session->name, -value=>$session->id );
                print $cgi->header(-cookie=>$cookie );

然后他们将被重定向到另一个页面,只要他们不关闭浏览器就可以访问该页面。以下是第二个页面的代码:

my $cookie = $cgi->cookie('CGISESSID');
if ($cookie){
        print $cgi->header(-cookie => $cookie);
else{
       //ask them to relog in
}

我可以看到在tmp/目录下创建了会话。当浏览器关闭后,如何加载现有的cookie?如何根据用户/浏览器知道要加载哪个会话?

1个回答

3
只要您在 cookie 上设置一个未来的过期日期,即使用户在重启浏览器之后(当然是在该日期之前重启),cookie 也应该会持久存在。要加载 cookie,请按照您正在执行的操作进行:
my $cookie = $cgi->cookie('CGISESSID');

要尝试使用cookie加载现有会话,您只需将CGI对象传递给CGI::Session的new方法:

my $session = new CGI::Session(undef, $cgi, {Directory=>"/tmp"});

这将尝试使用CGI请求中传递的cookie初始化现有会话;如果不存在,则会创建新会话。请注意,这假定cookie名称为CGISESSID。要使用其他名称,请运行:

CGI::Session->name("MY_SID");
# or
$session->name("MY_SID");

$session = new CGI::Session(undef, $cgi, {Directory=>'/tmp'});

如果您还没有这样做,我建议阅读CGI::Session教程

编辑:会话设置为一个月过期。

$session->expire('+1M');

但是 cookie 没有被设置。如果你没有在 cookie 上设置过期时间,浏览器会将其存储在内存中而不是磁盘上;一旦关闭浏览器,cookie 就会消失。要设置 cookie 过期时间,请执行以下操作:

$cookie = $cgi->cookie( -name=>$session->name, -value=>$session->id, -expires=>'+1M' );

谢谢。我已经阅读了文档,所以我不确定为什么我的 $cookie = $cgi->cookie('CGISESSID'); 没有返回任何内容?我在第二个文件中创建了一个新的 cgi 对象,也许这就是原因? - Jabda
1
@Jabda 你确定你的浏览器接收到了cookie并且它有正确的会话ID吗?在Firefox中,你可以通过进入“编辑->首选项->隐私->删除个别cookie”来检查。你会看到一个按站点组织的所有存储的cookie列表,还有一个搜索功能。 - ThisSuitIsBlackNot
是的,我看到了这些 cookie,但只有在我关闭浏览器之前才能看到。当我重新打开浏览器并返回该页面时,浏览器中没有 cookie(它们在 /tmp 中)。 - Jabda
@Jabda 还有两件事需要检查:1)在浏览器中查看 cookie 时,expires 设置为什么?2)在重新启动浏览器但在返回到 CGI 之前,您能否查看 cookie?您的 CGI 代码可能正在删除 cookie。 - ThisSuitIsBlackNot
在检查了过期时间设置后,我意识到它被设置为“浏览器会话”。我之前设置的是-session=>'+1M',但我需要将cookie设置为永不过期! $cookie = $cgi->cookie( -name => $session->name, -value => $session->id , -expires => '+1M'); - Jabda
1
@Jabda 啊,我在你的代码片段中没有注意到那个。我会把它加入我的答案中,以防将来有人遇到这个问题。 - ThisSuitIsBlackNot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接