【问题标题】:How to delete a session in cgi-perl?如何在 cgi-perl 中删除会话?
【发布时间】:2017-08-09 14:29:04
【问题描述】:

我有一个 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();

【问题讨论】:

  • 这绝对不是minimal reproducible example - 这段代码所做的只是创建一个会话然后删除它。
  • 我希望它在会话到期后删除。

标签: perl session


【解决方案1】:

为避免与 ->delete 混淆,我将使用“删除”一词而不是“删除”来表示从存储中删除会话。


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

会话到期时不会发生删除。这将需要一个持续运行的流程。此外,CGI::Session 绝不会扫描过期会话的存储;这将花费太长时间,因为它需要加载每个会话。相反,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 就会过期。问题是,浏览器的 cookie 是否过期并不重要。 new的第二个参数,传递undef,传递已删除会话的id和传递过期会话的id没有区别;在所有三种情况下,您都会获得一个新会话。如果有的话,最好不要在会话过期后立即过期,因为这样可以删除会话(如上所示)。


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

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

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

【讨论】:

  • 由于我们今天很挑剔,所以这个答案自相矛盾,首先说“CGI::Session 仅在您尝试加载过期会话时删除它们。”(强调原始),然后说它会在“保存会话时”删除它们,这不涉及尝试加载会话。
  • 所以我只想象最后一句非代码文本说“实际删除仅在您保存会话时发生。”? only 在加载会话时删除...并且在会话保存时也删除 only...这两个“only”不能同时为真。
  • 加载时会删除过期会话(使用 ->new 时)。已调用 ->delete 的会话在保存时将被删除。这两者可以同时成立。
  • @Dave Sherohman,修改了答案的措辞以帮助避免混淆。
  • @ikegami 你能给我一个同样的例子吗? “加载时删除过期会话(使用->新时)”是什么意思。当您使用“加载”时,您不会使用“新”,对吗?因为加载将创建一个会话,如果它已过期,如前所述。
【解决方案2】:

作为the documentation notes

delete()

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

你继续问:

另外,cookie 会在会话被删除后过期吗?

当然不是。您已经向用户的浏览器发送了一个 cookie,其过期时间为未来五分钟。 cookie 将会过期。

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

真的需要了解 HTTP 请求/响应周期,然后再采取进一步措施。

【讨论】:

  • 如何回答“有人可以帮我在会话过期后删除它吗?
【解决方案3】:

每个the CGI::Session documentationdelete会话“将对象状态设置为“已删除”。对同一对象的后续读/写请求将失败。从数据中物理删除它store 你需要调用flush()。"(强调我的)

另外,根据the CGI::Session::Tutorial“使会话过期与通过 delete() 删除它相同,但删除会自动发生。”@987654325 没有必要(或有用) @过期后的会话。

【讨论】:

  • @ikagami: 1) 它表明,在 CGI::Session 中,“过期”和“删除”是同义词。在delete 方法的意义上,过期的会话被删除。 2)OP实际上想要的是从磁盘中删除会话文件,答案表明这是通过调用flush方法完成的,而不是delete方法。
  • 回复:“过期”与“删除”,是的,我应该说“过期d”和“删除d”是同义词。除非您的意思是说文档不正确,因为它声称会话过期和删除之间的唯一区别是它被删除的时间?
  • 好的,所以你声称文档是错误的,当它说“使会话过期与通过 delete() 删除会话相同 ,但会自动删除。”我对所谓的错误不承担任何责任。
  • 您的回答至少无助于 OP 从磁盘中删除过期的会话,即使这是他们所要求的。
猜你喜欢
  • 2012-07-31
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
相关资源
最近更新 更多