Как вы получаете CGI :: Session истекает через определенный интервал? - PullRequest
1 голос
/ 14 октября 2011

Кажется, что функция 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 ]

1 голос
/ 15 октября 2011

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

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

#!/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
0 голосов
/ 14 октября 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?
...