1

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;
  }
4

2 に答える 2

1

更新:そうです、作成時間に基づいてセッションを期限切れにする場合は、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
于 2011-10-15T15:07:45.260 に答える
0

ドキュメントから:

「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?
于 2011-10-14T03:56:00.167 に答える