Как вы получаете 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;
  }

2 ответа

Решение

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

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

#!/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

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

"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?
Другие вопросы по тегам