2011-10-14 1 views
1

CGI :: Session expire() 함수는 사용자가 지정된 간격 동안 유휴 상태 일 때만 만료됩니다. 내가 유휴 상태에 있다고 가정 할 때 사용자가 페이지를 새로 고치지 않았거나 다른 사용자에게 액세스하지 못했음을 의미합니다.CGI :: Session은 일정한 간격 후에 어떻게 만료됩니까?

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

답변

1

업데이트 :는 세션을 원한다면 그래, 생성 시간을 기준으로 만료하려면 CGI :: 세션을 하위 클래스가

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

에 만료 된 상태로 얻을 수없는 것 같다

"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? 
+0

아니요 세션이 비어 있으면 아니오, 비어 있으면 현재 세션이로드 됨 – qodeninja