【问题标题】:Perl CGI persistent cookiesPerl CGI 持久性 cookie
【发布时间】:2013-09-26 02:38:31
【问题描述】:

即使浏览器关闭,我也希望用户不必登录。我的 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。我如何知道根据用户/浏览器加载哪个会话?

【问题讨论】:

    标签: perl cgi


    【解决方案1】:

    只要您为 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 过期时间,请执行以下操作

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

    【讨论】:

    • 谢谢。我已经阅读了文档,这就是为什么我不确定为什么我的 $cookie = $cgi->cookie('CGISESSID');不返回任何东西?我正在第二个文件中创建一个新的 cgi 对象,也许这就是为什么?
    • @Jabda 您是否检查过您的浏览器确实收到了 cookie 并且它具有正确的会话 ID?在 Firefox 中,您可以通过转到 Edit->Preferences->Privacy->remove individual cookies 来执行此操作。您会看到按站点组织的所有存储 cookie 的列表。还有搜索功能。
    • 是的,我看到了 cookie,但只是在我关闭浏览器之前。在我重新打开浏览器并导航回页面后,浏览器中没有 cookie(它们在 /tmp 中)
    • @Jabda 另外两件事要检查:1) 当您在浏览器中查看 cookie 时,expires 设置为什么? 2) 在重新启动浏览器但导航回您的 CGI 之前,您能否查看 cookie?您的 CGI 代码可能正在删除 cookie。
    • @Jabda 啊,我没有在你的代码 sn-p 中发现这一点。如果将来有人遇到这种情况,我会将其添加到我的答案中。
    猜你喜欢
    • 2016-04-24
    • 2013-03-06
    • 2017-07-25
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2020-06-19
    相关资源
    最近更新 更多