Perl CGI持久性cookie

时间:2013-09-25 17:26:30

标签: perl cgi

即使浏览器已关闭,我也希望用户无需登录。我的饼干将在一个月后过期。

当用户成功登录时

 $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 个答案:

答案 0 :(得分:3)

只要您在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 tutorial


编辑:会话设置为在一个月后到期

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

但饼干不是。如果您没有在cookie上设置过期,浏览器会将其存储在内存中但不会存储在磁盘上;一旦关闭浏览器,cookie就会消失。要设置Cookie过期,请执行类似

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