如果我在登录时创建了新会话,并且也创建了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到期时间应该是多少?
我该如何处理这种情况?
答案 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。