如何在 cgi-perl 中删除会话?



我有一个perl-cgi脚本,我正在尝试通过它登录。

当用户名和密码有效时,我创建一个会话并将cookie重定向到另一个页面。

但是,在会话过期后(我已经设置了过期时间(,在这种情况下,我没有看到它从/tmp/sessions 文件夹中被删除。我也使用该命令删除了会话。

有人可以在会话过期后帮助我删除会话吗?另外,删除会话后,cookie 会过期吗?

use CGI::Session;
use CGI::Session::Tutorial;
use CGI::Session::Driver::file; 
use CGI::Cookie;
my $session = new CGI::Session("driver:File", undef, {Directory=>"/tmp/sessions"});         
my $sid = $session->id();           
#my $cookie = $query->cookie(CGISESSID => $session->id);
my $cookie = $query->cookie(-name=>"CGISESSID",
-value=>$session->id,
-domain=>'abc.com',
-expires=>"+5m",
-path=>"/");
print $query->redirect(-uri => 'http://abc.cgi', -cookie => $cookie);
$session->param("UserName", $loginUserName);
$query->hidden( 'UserName', $loginUserName );
$session->expire("UserName",'1m');
$session->expire('+5m'); 
$session->delete();

为了避免与->delete混淆,我将使用单词"删除"而不是"删除"来指代从存储中删除会话。


有人可以在会话过期后帮助我删除会话吗?

会话过期时不会进行删除。这需要一个持续运行的过程。此外,CGI::会话绝不会扫描过期会话的存储;这将花费太长时间,因为它需要加载每个会话。相反,CGI::Session 仅在您尝试加载过期会话时删除它们。

#!/usr/bin/perl
use strict;
use warnings qw( all );
use feature qw( say );
use CGI::Session               qw( );
use CGI::Session::Driver::file qw( );
my $session_id;   # This represents the browser's cookie.
# These represent requests made the by the browser.
for my $request_num (1..3) {
my $session = CGI::Session->new("driver:file", $session_id, { Directory => "/tmp/sessions" });
$session->expire("1s");
$session_id = $session->id;  # This represents setting the browser's cookie.
say "$request_num: ", $session->id;
say "$request_num: ", $session->param("foo") // "[undef]";
$session->param("foo" => "bar");
# This represents time passing by before the third request.
if ($request_num == 2) {
say "Letting session expire...";
sleep(2);
}   
}

输出:

$ ./a
1: c57ab28952c6ed422c15f1a223f4b45d
1: [undef]
2: c57ab28952c6ed422c15f1a223f4b45d
2: bar
Letting session expire...
3: df8ba3b66f23a9a2a652520fa6b4c30b
3: [undef]
$ ls -1 /tmp/sessions
cgisess_df8ba3b66f23a9a2a652520fa6b4c30b

如果要防止文件在驱动器上累积,请创建一个删除旧文件的cron作业。

find /tmp/sessions -mindepth 1 -maxdepth 1 -mtime 7 -delete
另外,删除

会话后,cookie 会过期吗?

不,当您告诉它过期时,cookie 会过期。问题是,浏览器的cookie是否过期并不重要。对于new的第二个参数,传递undef、传递已删除会话的 id 和传递过期会话的 id 之间没有区别;在所有三种情况下,您都会获得一个新的会话。如果有的话,如果它不会在会话过期后立即过期,那实际上会更好,因为这允许删除会话(如上所述(。


如何在 cgi-perl 中删除会话?

$session->delete确实是要走的路,但实际删除仅在您保存(刷新(会话时发生。

$session->delete();
$session->flush();  # Or let `$session` get destroyed.

正如文档注释所示

delete()

将对象状态设置为"已删除"。对同一对象的后续读/写请求将失败。要从数据存储中物理删除它,您需要调用flush()CGI::Session尝试在销毁对象时(通常在脚本退出时(自动执行此操作,但请参阅"有关自动刷新的警告"。(强调我的(

你继续问:

另外,删除

会话后,cookie 会过期吗?

当然不是。您已经向用户的浏览器发送了一个 Cookie,其有效期为未来五分钟。然后,该 Cookie 将过期。

如果同时,您强制服务器上的会话过期,则用户的浏览器仍将发送先前收到的cookie。您的应用程序将找不到与存储在 Cookie 中的会话标识符对应的会话。

在采取进一步措施之前,您确实需要了解 HTTP 请求/响应周期。

根据 CGI::Session 文档,delete会话"将对象状态设置为"已删除"。对同一对象的后续读/写请求将失败。要从数据存储中物理删除它,您需要调用 flush((。(强调我的(

此外,根据 CGI::Session::教程,"使会话过期与通过 delete(( 删除会话相同,但删除会自动发生。在会话过期后delete会话是没有必要(或有用的(的。

最新更新