3

即使浏览器关闭,我也希望用户不必登录。我的 cookie 设置为一个月后过期。

当用户成功登录时

 $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。我如何知道根据用户/浏览器加载哪个会话?

4

1 回答 1

3

只要您在 cookie 上设置了未来的到期日期,即使在用户重新启动浏览器后它们也应该持续存在(当然,只要它们在该日期之前重新启动)。要加载 cookie,请执行您正在执行的操作:

my $cookie = $cgi->cookie('CGISESSID');

要尝试使用 cookie 加载现有会话,您可以简单地将 CGI 对象传递给newCGI::Session 的方法:

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 = $cgi->cookie( -name=>$session->name, -value=>$session->id, -expires=>'+1M' );
于 2013-09-25T17:46:00.417 回答