Как сделать так, чтобы CGI::Session истекал через определенный интервал?

Похоже, что функция CGI::Session expire() истекает только после того, как пользователь бездействует в течение заданного интервала. Я предполагаю, что под простоем они подразумевают, что пользователь не обновил страницу или не получил доступ к каким-либо другим.

Хотя я вижу, что вы можете принудительно завершить сеанс с помощью delete(), я не вижу способа автоматически принудительно истечь срок действия сеанса независимо от того, было ли использование бездействующим или нет.

Возможно, это нежелательный пользовательский опыт, но для понимания есть ли способ сделать это без необходимости отслеживать временной интервал или использовать какие-либо дополнительные библиотеки?

Также в чем смысл CGI::Session::is_expired, если сеанс все равно возвращает новый, когда он истечет? По крайней мере, кажется, что я не могу перейти в состояние с истекшим сроком действия с моим скриптом

  sub build_sss{
    my($this) = shift;

    $cgi = $this->cgi_obj();

    my $sid = $this->sid();
    my $sss = CGI::Session->load(undef, $cgi, {Directory=>'tmp'}) or die CGI::Session->errstr();

   #check expired session
    if ( $sss->is_expired() ) {
      my $expired_url = $ENV{'SCRIPT_URI'}.'?expired='.$sid;
      $this->session_status("SESSION_EXPIRED");
      print $cgi->redirect($expired_url); #when expired param is set shows a msg    
    }


    #check if empty create new
    if ( $sss->is_empty() ) {     
      $sss = $sss->new() or $sss->errstr;
      $this->session_status("SESSION_NEW");
      $sss->expire('30s');
      $sss->expire(_TEST_SUB_SESSION => '15s');
    }

    return $sss;
  }

person qodeninja    schedule 14.10.2011    source источник


Ответы (2)


update: так что да, если вы хотите, чтобы сеанс истекал в зависимости от времени создания, вы должны создать подкласс CGI::Session

1) убедитесь, что у вас установлена ​​последняя версия CGI::Session 2) прочтите CGI::Session::Tutorial 3) напишите программы, подтверждающие ваши утверждения, например, Демо CGI::Session expired

#!/usr/bin/perl --

use strict;
use warnings;

use CGI();
use CGI::Session();

my ($oneid);
{
  my $one = CGI::Session->new or die CGI::Session->errstr;
  $one->expire('3s');
  $one->param(qw' var value ');
  $oneid = $one->id;

  print "set exire to 3 seconds\n";
}

for my $loop ( 1 .. 4 ) {
  sleep 1;
  my $bob = CGI::Session->load($oneid) or die CGI::Session->errstr;
  print "one second later $bob / $oneid load\n";
}

for my $loop ( 1 .. 4 ) {
  sleep 2;
  my $bob = CGI::Session->load($oneid) or die CGI::Session->errstr;
  print "two seconds later ";
  if ( $bob->is_expired ) {
    print "$bob / $oneid is_expired\n";
  } else {
    print "var=", $bob->param('var'), "\n";
  }
} ## end for my $loop ( 1 .. 4 )

{
  sleep 3;
  my $bob = CGI::Session->load($oneid) or die CGI::Session->errstr;
  print "three seconds later  ";
  if ( $bob->is_expired ) {
    print "$bob / $oneid is_expired\n";
  } else {
    print "var=", $bob->param('var'), "\n";
  }
}

__END__



set exire to 3 seconds
one second later CGI::Session=HASH(0xa965fc) / cf27e3ec9ff5a06a5bef4491e830c8b6 load
one second later CGI::Session=HASH(0x97a164) / cf27e3ec9ff5a06a5bef4491e830c8b6 load
one second later CGI::Session=HASH(0xbef68c) / cf27e3ec9ff5a06a5bef4491e830c8b6 load
one second later CGI::Session=HASH(0xbef56c) / cf27e3ec9ff5a06a5bef4491e830c8b6 load
two seconds later var=value
two seconds later var=value
two seconds later var=value
two seconds later var=value
three seconds later  CGI::Session=HASH(0xa965ec) / cf27e3ec9ff5a06a5bef4491e830c8b6 is_expired
person shrinky    schedule 15.10.2011

Из документации:

«is_empty() — возвращает true для пустых сессий. Это предпочтительный способ проверить, успешно ли загрузилась запрошенная сессия»

Я не понимаю, как вы пытаетесь истечь сеанс при условии, что он пуст?

#check if empty create new
if ( $sss->is_empty() ) {     
  $sss = $sss->new() or $sss->errstr;
  $this->session_status("SESSION_NEW");
  $sss->expire('30s');
  $sss->expire(_TEST_SUB_SESSION => '15s');
}

Возможно, вы имели в виду:

if ( !$sss->is_empty() ) { #...Not empty?
person jbobbylopez    schedule 14.10.2011
comment
Нет, если сеанс пуст, он должен создать новый, если он пуст, то у него загружен текущий сеанс. - person qodeninja; 14.10.2011