如何在CGI :: Session中设置cookie过期时间?

时间:2017-08-15 15:11:28

标签: perl session

如果我在登录时创建了新会话,并且也创建了cookie。每次我在另一个页面中执行活动时,我都会编写代码以将会话时间增加10分钟。但是,在最后一次执行活动10分钟后,会话将过期(如果空闲),但它将从cookieID创建。

登录页面: 如果凭据有效 - >

        my $session = new CGI::Session("driver:File", undef, {Directory=>"/tmp/sessions"});         
        my $sid = $session->id();           
        $page = 'page1'; 

        my $cookie = $query->cookie(-name=>"CGISESSID",
                        -value=>$session->id,
                        -domain=>'test.com',
                        path=>"/");
        print "Set-Cookie: $cookie\n";  
         $session->expire('+10m'); 

Page1 :(当第1页加载或在第1页中执行任何活动时)

    my $cookieSid = $query->cookie("CGISESSID") || undef;
    my $session;
    $session    = CGI::Session->load(undef, $cookieSid, 
    {Directory=>'/tmp/sessions'});
    $session->expire('+10m');
    my $cookie = $query->cookie(-name=>"CGISESSID",
                                -value=>$session->id,
                                 -path=>"/");
    print "Set-Cookie: $cookie\n";  

我已将Cookie设置为在浏览器关闭时过期。如果会话过期,我想重定向到登录页面。但是上面的代码将使用相同的cookieID继续初始化会话。在这种情况下,cookie到期时间应该是多少?

我该如何处理这种情况?

2 个答案:

答案 0 :(得分:2)

使用->load而不检查您是否有有效的会话是不好的。您应该使用->new,因为它会为您处理所有这些。两个页面都应该使用

# Get session id if any.
my $sid = $query->cookie("CGISESSID");

# Load or create session.
my $session = CGI::Session->new("driver:file", $sid, { Directory => "/tmp/sessions" });
$session->expire('+10m');

# Update $sid since session id may have changed.
$sid = $session->id();

my $cookie = $query->cookie(
   -name   => "CGISESSID",
   -value  => $id,
   -domain => 'test.com',
   -secure => $ENV{SERVER_PROTOCOL} =~ /s\z/i ? 1 : 0,
   -path   => "/",
);
print "Set-Cookie: $cookie\n";  

当有人登录时,您会执行类似

的操作
$session->param( user => $user );

如果要检查是否有人登录,可以使用

if (defined($session->param('user'))) { ... }

现在,您询问了如何使Cookie过期。这是使用

完成的
-expires => "+10m"

但我不会这样做。由于过期的会话在加载时从存储中删除,因此很有可能将会话ID提供给过期的会话。如果您在会话的同时使cookie过期,则不会发生这种情况。

答案 1 :(得分:1)

您已经为会话设置了新的相对过期时间。没有什么可以阻止你做for the cookie了。

$session->expire('+10m');
my $cookie = $query->cookie(
    -name    => "CGISESSID",
    -value   => $session->id,
    -path    => "/",
    -expires => "+10m",
);
print "Set-Cookie: $cookie\n";  

由于cookie将在每个响应头中发送,因此浏览器每次都会在其cookie jar中覆盖它。

由于您希望cookie和会话同时过期,您可能希望将其作为配置值,并使用变量代替两个"+10m"字符串。

另请注意,如果会话已过期,则稍后返回的用户不应该成为问题。他们可能重新激活旧ID,但它将是一个恰好具有相同ID的新会话。

如果您不相信,可以在加载后加check if the session is expired,如果有,则加delete it